home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / document / hypertxt / xfsl / xfsl.txt < prev    next >
Encoding:
Text File  |  1995-11-25  |  81.3 KB  |  2,001 lines

  1.                            Beschreibung der
  2.  
  3.                           xFSL-Schnittstelle
  4.  
  5.                               Revision 4
  6.                               21.07.1995
  7.  
  8.                                  von
  9.  
  10.                               Dirk Haun
  11.                              Europastr. 8
  12.                            D-64569 Nauheim
  13.  
  14.                            Dirk Haun @ WI2
  15.  
  16.  
  17.  
  18. Inhaltsverzeichnis
  19. ==================
  20.  
  21.  0 Einleitung
  22.  
  23.  1 Die xFSL-Schnittstelle
  24.    1.1 Der xFSL-Cookie
  25.    1.2 Der vereinfachte Aufruf (xfsl_input)
  26.    1.3 Der erweiterte Aufruf
  27.        1.3.1 xfsl_init
  28.        1.3.2 xfsl_event
  29.        1.3.3 xfsl_exit
  30.    1.4 Der Info-Aufruf (xfsl_info)
  31.    1.5 Die VDI-Workstation
  32.    1.6 Die xFSL_PAR-Struktur
  33.        1.6.1 Die Kontrollflags
  34.        1.6.2 Die PFONTINFO-Struktur
  35.        1.6.3 Das User-Popup
  36.    1.7 Die Fontflags
  37.    1.8 Returncodes
  38.    1.9 Die Pure-C-Event-Struktur
  39.  
  40.  2 Tips und Hinweise
  41.    2.1 Ein einfacher Aufruf
  42.    2.2 Fragen und Antworten
  43.    2.3 Programmiertechnische Hinweise
  44.        2.3.1 Datentypen
  45.        2.3.2 Parameterübergabe
  46.        2.3.3 Pure C und 'cdecl'
  47.  
  48.  3 Revisions-History
  49.  
  50.  4 Programmübersicht
  51.    4.1 Fontselektor-Übersicht
  52.    4.2 Programme, die einen Fontselektor unterstützen
  53.  
  54. Anhang
  55. ======
  56.  
  57.  A Das Font-Protokoll
  58.  
  59.  B Die UFSL-Schnittstelle
  60.  
  61.  C Hinweise für Autoren anderer Fontselektoren
  62.  
  63.  D Kontaktadressen
  64.  
  65.  
  66.  
  67. 0 Einleitung
  68. ============
  69.  
  70. Spätestens seit der Einführung von Vektorfonts erfreut sich das GDOS,
  71. das jahrelang auf dem Atari ein Schattendasein führte, steigender Be-
  72. liebtheit. Immer mehr Programme bieten die Möglichkeit, für die Ausga-
  73. be (und teilweise auch für die Eingabe) einen anderen Font als den
  74. Systemfont zu verwenden.
  75.  
  76. Um nun einen Font auswählen zu können, benötigt man einen Fontselek-
  77. tor. Und damit nicht jeder Programmierer sein eigenes Süppchen kocht
  78. und im Sinne einer einheitlichen Bedienung entstand der Wunsch nach
  79. einer Systemerweiterung, die einen Fontselektor - ähnlich wie einen
  80. Fileselektor - für alle Programme zur Verfügung stellt.
  81.  
  82. Das erste derartige Programm war der UFSL von Michael Thänitz. Er
  83. stellt über einen Cookie Routinen zum Aufruf eines Fontselektors zur
  84. Verfügung. Diese Schnittstelle wird bereits von einer Reihe von Pro-
  85. grammen verwendet und es gibt auch bereits weitere Fontselektoren,
  86. die über diese Schnittstelle aufgerufen werden können.
  87.  
  88. Zwar läßt sich nun über die UFSL-Schnittstelle ein Fontselektor auf-
  89. rufen, doch hat diese Schnittstelle bereits eine Reihe von - zum Teil
  90. inkompatiblen - Änderungen und Erweiterungen hinter sich. Daher gehen
  91. die meisten Programme heute davon aus, daß sie nur die ursprüngliche
  92. einfache UFSL-Schnittstelle zur Verfügung haben. Im Endeffekt bleiben
  93. also die Erweiterungen ungenutzt und wenn in einem Programm dann doch
  94. einmal ein etwas leistungsfähigerer Fontselektor benötigt wird, dann
  95. geht man doch wieder dazu über, extra für das Programm einen neuen
  96. Fontselektor zu schreiben. Etwas überspitzt formuliert wird hier also
  97. die Idee eines externen Fontselektors ad absurdum geführt ...
  98.  
  99. Durch den "Wildwuchs" an der UFSL-Schnittstelle erschien es sinn-
  100. voller, einen klaren Trennstrich zu ziehen und eine komplett neue
  101. Schnittstelle zu entwickeln, die dann auch über einen neuen Cookie
  102. angeboten wird.
  103.  
  104. Dieser Text beschreibt diese neue Schnittstelle, über die nicht nur
  105. einfach ein Fontselektor aufgerufen, sondern auch in vielfältiger
  106. Weise Einfluß auf diesen genommen werden kann.
  107.  
  108.  
  109.  
  110. 1 Die xFSL-Schnittstelle
  111. ========================
  112.  
  113. Über die xFSL-Schnittstelle hat der Aufrufer (d.h. das Programm, das
  114. den Fontselektor aufruft) wesentlich mehr Einfluß auf den Fontselek-
  115. tor, sein Verhalten und auf die zur Auswahl angebotenen Fonts.
  116.  
  117. Bei der Konzeption der neuen Schnittstelle wurde versucht, auf die
  118. Möglichkeiten der verschiedenen Programmiersprachen Rücksicht zu neh-
  119. men (z.B. Vermeidung von Zeigern auf Funktionen) und gleichzeitig für
  120. mögliche Erweiterungen der Schnittstelle gerüstet zu sein.
  121.  
  122. Die Anpassung eines Programms an die xFSL-Schnittstelle sollte eine
  123. Sache von wenigen Minuten sein, zumal Beispielaufrufe in verschiede-
  124. nen Programmiersprachen mitgeliefert werden. Die Umsetzung spezieller
  125. Wünsche ist natürlich u.U. etwas aufwendiger, sollte aber auch kein
  126. unlösbares Problem darstellen.
  127.  
  128. Es folgt die Beschreibung des xFSL-Cookies sowie der verschiedenen
  129. xFSL-Aufrufe und Parameter ...
  130.  
  131.  
  132. 1.1 Der xFSL-Cookie
  133. -------------------
  134.  
  135. Wenn ein Fontselektor installiert ist, der die xFSL-Schnittstelle un-
  136. terstützt, dann existiert ein Cookie "xFSL", dessen Wert ein Zeiger
  137. auf die folgende Struktur ist:
  138.  
  139.     typedef struct
  140.     {
  141.      unsigned long xfsl;       /* Magic 'xFSL'              */
  142.      unsigned int  revision;   /* Schnittstellen-Revision   */
  143.      unsigned long product;    /* Kennung des Fontselektors */
  144.      unsigned int  version;    /* Version des Fontselektors */
  145.      xFSL_INPUT    xfsl_input; /* einfacher Aufruf          */
  146.      xFSL_INIT     xfsl_init;  /* Init-Aufruf               */
  147.      xFSL_EVENT    xfsl_event; /* Event-Aufruf              */
  148.      xFSL_EXIT     xfsl_exit;  /* Exit-Aufruf               */
  149.      xFSL_INFO     xfsl_info;  /* Info-Aufruf               */
  150.     } xFSL;
  151.  
  152. Die Komponenten der Struktur im einzelnen:
  153.  
  154.  xfsl Hier steht, nur zur Sicherheit, nochmals die ASCII-Zeichenfolge
  155.     "xFSL" (entspricht hexadezimal $7846534C).
  156.  
  157.  revision Dies ist die Revisionsnummer der xFSL-Schnittstelle, sie
  158.     enthält z.Z. den Wert 4. Sollte die Schnittstelle erweitert wer-
  159.     den, so werden dort entsprechend höhere Werte zu finden sein.
  160.  
  161.  product Hier findet sich eine Kennung für den tatsächlich installier-
  162.     ten Fontselektor. Diese Angabe ist jedoch nur als zusätzliche
  163.     Information gedacht und sollte von Anwendungsprogrammen, die den
  164.     Fontselektor aufrufen wollen, nicht ausgewertet werden!
  165.  
  166.     Bisher verwendete Kennungen:
  167.  
  168.          Kennung Fontselektor
  169.         ----------------------
  170.          CLVN    Calvino
  171.          FSEL    FontSel
  172.          HUGO    HuGo!
  173.  
  174.     Die Kennung (wie auch die folgende Versionsnummer) wurde nur für
  175.     Programme eingeführt, die eine Information über den installierten
  176.     Fontselektor ausgeben wollen (z.B. das Programm SysInfo).
  177.  
  178.  version Die Versionsnummer des installierten Fontselektors als BCD-
  179.     Zahl (z.B. hexadezimal $100 für Version 1.00). Hier gelten sinnge-
  180.     mäß die Anmerkungen zum Feld 'product'.
  181.  
  182.  xfsl_input Dies ist der Einsprungpunkt für einen vereinfachten Auf-
  183.     ruf des Fontselektors. Der Fontselektor erscheint dann immer als
  184.     modaler Dialog und die meisten zusätzlichen Features der xFSL-
  185.     Schnittstelle können nicht angesprochen werden.
  186.  
  187.  xfsl_init, xfsl_event, xfsl_exit  Diese drei Funktionen bilden zusam-
  188.     men den erweiterten Fontselektor-Aufruf. Hierüber können alle
  189.     neuen Features angesprochen werden. Die Vorgehensweise entspricht
  190.     dem Darstellen eines GEM-Dialogs:
  191.  
  192.      a) Fontselektor darstellen (xfsl_init)
  193.  
  194.      b) Eventbehandlung in einer Schleife, bis "OK" oder "Abbruch"
  195.         angewählt wurde (xfsl_event)
  196.  
  197.      c) Fontselektor vom Bildschirm entfernen (xfsl_exit)
  198.  
  199.  xfsl_info Über diese Aufruf können einige der Features des instal-
  200.     lierten Fontselektors abgefragt werden, z.B. Drag&Drop-Unter-
  201.     stützung.
  202.  
  203.  
  204. 1.2 Der vereinfachte Aufruf (xfsl_input)
  205. ----------------------------------------
  206.  
  207. xfsl_input ist der Einsprungpunkt für einen vereinfachten Aufruf. Der
  208. Fontselektor kann darüber nur als modaler Dialog aufgerufen werden.
  209. Außerdem kann eine Überschrift angegeben und eingeschränkt werden,
  210. welche Arten von Fonts der Selektor zur Auswahl stellen soll.
  211.  
  212.     int xfsl_input(int           vdihandle,
  213.                    unsigned int  fontflags,
  214.                    const char   *headline,
  215.                    int          *id,
  216.                    int          *size
  217.                   );
  218.  
  219. Die Parameter im einzelnen:
  220.  
  221.  vdihandle  Hier übergeben Sie das Handle einer von Ihrem Programm be-
  222.             reits geöffneten virtuellen VDI-Workstation (wenn Sie in
  223.             Ihrem Programm einen Font einstellen wollen, müssen Sie
  224.             ja ohnehin eine solche VDI-Workstation öffnen). Der Font-
  225.             selektor übernimmt dann den auf dieser Workstation gerade
  226.             eingestellten Font als aktuellen Font (vorausgesetzt, er
  227.             wird durch die Fontflags überhaupt zur Auswahl gestellt).
  228.  
  229.             Statt eines gültigen Handles können Sie aber auch einfach
  230.             eine Null übergeben, dann wird der Fontselektor den Font
  231.             anzeigen, den Sie in den Parametern 'id' und 'size' über-
  232.             geben.
  233.  
  234.             Wenn Sie ein VDI-Workstation-Handle übergeben, wird der
  235.             ausgewählte Font auf dieser Workstation auch gleich einge-
  236.             stellt.
  237.  
  238.  fontflags  Über die Fontflags können Sie festlegen, welche Fonts
  239.             überhaupt zur Auswahl gestellt werden.
  240.  
  241.  headline   Hier können Sie eine Überschrift angeben, die dann im
  242.             Fontselektor erscheint. Fehlt die Überschrift (Übergabe
  243.             von 0L), dann wird ein Defaulttext ("Fontauswahl" o.ä.)
  244.             eingesetzt.
  245.  
  246.  id         In dieser Variablen wird die ID des ausgewählten Zeichen-
  247.             satzes zurückgeliefert (natürlich nur, wenn auch wirklich
  248.             ein Zeichensatz ausgewählt wurde). Dieser Zeichensatz
  249.             kann nun direkt mit der VDI-Funktion vst_font() einge-
  250.             stellt werden.
  251.  
  252.             Wenn Sie in 'vdihandle' eine Null übergeben, wird der
  253.             Fontselektor den in 'id' angegebenen Font anzeigen.
  254.  
  255.  size       In dieser Variablen wird die Größe des ausgewählten Fonts
  256.             in Punkt zurückgegeben (auch nur, wenn wirklich ein neuer
  257.             Zeichensatz ausgewählt wurde). Wenn es sich um einen Bit-
  258.             mapfont handelt, kann diese Größe mit der VDI-Funktion
  259.             vst_point() eingestellt werden. Für Vektorfonts sollte
  260.             die Funktion vst_arbpt() aufgerufen werden.
  261.  
  262.             Wenn Sie in 'vdihandle' eine Null übergeben, wird der
  263.             Fontselektor den in 'id' angegebenen Font in der in
  264.             'size' angegebenen Größe anzeigen.
  265.  
  266.  
  267. Rückgaben
  268.  
  269. xfsl_input liefert eine negative Zahl zurück, wenn ein Fehler aufge-
  270. treten ist. Eine 0 wird zurückgegeben, wenn "Abbruch" angewählt wur-
  271. de. Wird eine 1 zurück geliefert, dann wurde ein neuer Font
  272. ausgewählt.
  273.  
  274. Die Rückgabewerte sind für alle xFSL-Funktionen gleich und aufwärts-
  275. kompatibel zu den Rückgabewerten des UFSL.
  276.  
  277.  
  278. 1.3 Der erweiterte Aufruf
  279. -------------------------
  280.  
  281. Der erweiterte xFSL-Aufruf besteht aus drei einzelnen Funktionsauf-
  282. rufen:
  283.  
  284.  xfsl_init   Stellt den Fontselektor auf dem Bildschirm dar. Außerdem
  285.              werden hier die Parameter übergeben.
  286.  
  287.  xfsl_event  Diese Funktion wird solange immer wieder aufgerufen, bis
  288.              im Fontselektor ein Font ausgewählt, oder "Abbruch" ange-
  289.              wählt wurde.
  290.  
  291.  xfsl_exit   Entfernt den Fontselektor wieder vom Bildschirm.
  292.  
  293.  
  294. In C kann das dann beispielsweise so ausssehen:
  295.  
  296.     xhandle=xfsl->xfsl_init(vdihandle,&xpar);
  297.     if(xhandle>=0)
  298.     {
  299.      do
  300.      {
  301.       ret=xfsl->xfsl_event(xhandle,0L);
  302.       if(ret==xFS_HELP) ...;         /* Hilfefunktion aufrufen */
  303.       else if(ret==xFS_POPUP) ...;   /* Popup behandeln        */
  304.       else if(ret==xFS_EVENT) ...;   /* AES-Event bearbeiten   */
  305.      }
  306.      while(ret!=xFS_OK && ret!=xFS_STOP);
  307.      xfsl->xfsl_exit(xhandle);
  308.     }
  309.  
  310. Diese "Dreiteilung" hat u.a. den Vorteil, daß zur Bearbeitung der
  311. Ereignisse (Hilfe-Button, Popup, AES-Events) keine Zeiger auf Funk-
  312. tionen übergeben werden müssen (was in einigen Programmiersprachen
  313. nur schwer zu realisieren ist). Auch läßt sich die Schnittstelle so
  314. leicht um weitere Ereignisse erweitern, falls dies einmal nötig sein
  315. sollte.
  316.  
  317.  
  318. 1.3.1 xfsl_init
  319.  
  320. Dieser Aufruf bringt nicht nur den Fontselektor auf den Bildschirm,
  321. er bestimmt auch, welche Fonts angezeigt werden sollen, ob ein User-
  322. Popup verwendet wird und einiges mehr.
  323.  
  324.     int xsfl_init(int       vdihandle,
  325.                   xFSL_PAR *xpar
  326.                  );
  327.  
  328. Die beiden Parameter bedeuten:
  329.  
  330.  vdihandle  Hier übergeben Sie, wie schon beim vereinfachten Aufruf,
  331.             das Handle einer von Ihrem Programm bereits geöffneten
  332.             virtuellen VDI-Workstation oder einfach eine Null.
  333.  
  334.             Wenn Sie ein gültiges Workstation-Handle übergeben, wird
  335.             der Fontselektor den auf dieser Workstation aktuellen
  336.             Font übernehmen und anzeigen - sofern er duch die Font-
  337.             flags (in der xFSL_PAR-Struktur) überhaupt zur Auswahl
  338.             gestellt wird. Ist dies nicht der Fall, wird der Fontse-
  339.             lektor einen Font aus den zur Verfügung stehenden aus-
  340.             wählen und anzeigen.
  341.  
  342.             Übergeben Sie als Workstation-Handle eine Null, dann wird
  343.             der Font aus der PFONTINFO-Struktur (auf die ein Zeiger
  344.             in der xFSL_PAR-Struktur zeigt) übernommen und angezeigt.
  345.  
  346.             Wenn Sie ein VDI-Workstation-Handle übergeben, wird der
  347.             ausgewählte Font auf dieser Workstation auch gleich
  348.             eingestellt.
  349.  
  350.  xpar       Dies ist ein Zeiger (d.h. die Adresse) auf eine xFSL_PAR-
  351.             Struktur, die alle weiteren Angaben für den Fontselektor
  352.             enthält.
  353.  
  354.             Wegen der Vielzahl der Möglichkeiten wurde dieser Struk-
  355.             tur ein eigener Abschnitt gewidmet.
  356.  
  357. Für die Returncodes der Funktion gilt wieder: Ein negativer Rückgabe-
  358. wert deutet auf einen Fehler hin. Positive Werte haben hier eine et-
  359. was abweichende Bedeutung: Eine 0 heißt, der Fontselektor wurde (er-
  360. folgreich) als modaler Dialog geöffnet. Andere positive Werte ent-
  361. sprechen dem Fensterhandle des geöffneten Fontselektors. Somit können
  362. Sie das Fenster des Fontselektors beispielsweise bei einem AV-Server
  363. anmelden.
  364.  
  365. Im Erfolgsfalle (Rückgabe größer oder gleich 0) sollten Sie sich das
  366. Handle in einer Variablen merken, da es für die folgenden Aufrufe
  367. (xfsl_event und xfsl_exit) noch benötigt wird.
  368.  
  369. Hinweis: Wenn der Fontselektor als Fenster dargestellt werden sollte,
  370. xfsl_init aber den Fehler xFS_NO_WINDOW liefert (kein Fenster mehr
  371. frei), dann sollte möglichst versucht werden, den Fontselektor wenig-
  372. stens als Dialog darzustellen (Kontrollflag CC_WINDOW löschen und
  373. nochmals xfsl_init aufrufen).
  374.  
  375. Merke: Der Anwender will einen Fontselektor, keine Fehlermeldung.
  376.  
  377.  
  378. 1.3.2 xfsl_event
  379.  
  380. Wenn der Fontselektor initialisiert und auf den Bildschirm gebracht
  381. wurde, übernimmt xfsl_event die Hauptarbeit.
  382.  
  383.     int xfsl_event(int    xhandle,
  384.                    EVENT *event
  385.                   );
  386.  
  387. Die beiden Parameter bedeuten:
  388.  
  389.  xhandle  Das Handle des Fontselektors, wie es von xfsl_init gelie-
  390.           fert wurde.
  391.  
  392.  event    Zeiger auf eine EVENT-Struktur, wie sie von Pure C verwen-
  393.           det wird. In dieser Struktur liefert der Fontselektor AES-
  394.           Events zurück, die er nicht selbst bearbeiten konnte. Außer-
  395.           dem können Sie über die Eingabeparameter dem Fontselektor
  396.           auch mitteilen, über welche Ereignisse sie überhaupt unter-
  397.           richtet werden wollen.
  398.  
  399.           Der Zeiger kann aber auch einfach Null sein, wenn Sie keine
  400.           (weiteren) Events auswerten wollen. Soll der Fontselektor
  401.           als Fensterdialog betrieben werden und der Aufrufer (d.h.
  402.           Ihr Programm) hat noch weitere Fenster offen, dann müssen
  403.           Sie aber zumindest die Redraw-Meldungen auswerten!
  404.  
  405.           Beispiel: Wenn Sie in 'ev_mflags' das Flag MU_MESAG setzen,
  406.           wird der Fontselektor alle eintreffenden AES-Nachrichten,
  407.           die er nicht selbst bearbeiten kann, an den Aufrufer zurück-
  408.           liefern.
  409.  
  410.           Hinweis: Es ist natürlich auch möglich, Timer-Events zu be-
  411.           kommen. Diese sollten aber sparsam eingesetzt werden und
  412.           nicht zu kurz sein, da der Fontselektor dazu jedesmal erst
  413.           seine eigene Event-Schleife verlassen muß. 250 ms mögen als
  414.           - unverbindliche - untere Grenze gelten.
  415.  
  416. Die möglichen Rückgabewerte von xfsl_event:
  417.  
  418.  xFS_STOP   Im Fontselektor wurde der Button "Abbruch" oder (so vor-
  419.             handen) der Closer des Fensterdialogs angewählt.
  420.  
  421.             Wenn das Kontrollflag CC_CLOSER gesetzt ist und der
  422.             Closer angeklickt wurde, enthält die PFONTINFO-Struktur,
  423.             auf die der Zeiger in der xFSL_PAR-Struktur zeigt, aber
  424.             trotzdem Angaben darüber, welcher Font zuletzt im Fontse-
  425.             lektor angewählt worden war. Anders wäre diese Informati-
  426.             on sonst ja nicht zu erhalten.
  427.  
  428.  xFS_OK     Es wurde ein Font ausgewählt und "OK" angewählt. Welcher
  429.             Font ausgewählt wurde, beschreibt die PFONTINFO-Struktur,
  430.             auf die der Zeiger in der xFSL_PAR-Struktur zeigt. Wenn
  431.             bei xfsl_init ein gültiges VDI-Handle übergeben wurde,
  432.             dann wird der ausgewählte Font auch gleich auf dieser VDI-
  433.             Workstation eingestellt.
  434.  
  435.  xFS_HELP   Der Hilfe-Button wurde angewählt (kann natürlich nur auf-
  436.             treten, wenn Sie ihn haben einblenden lassen). Es liegt
  437.             nun am Aufrufer, wie er darauf reagiert. Im Normalfall
  438.             wird man wohl eine Hilfe geben, z.B. indem man eine Hilfs-
  439.             seite anzeigt oder anzeigen läßt.
  440.  
  441.  xFS_EVENT  Ein AES-Event ist aufgetreten, den der Fontselektor nicht
  442.             bearbeiten konnte (z.B. eine Redraw-Meldung für ein ande-
  443.             res Fenster). Welcher Event es genau war, können Sie dem
  444.             Feld 'ev_mwich' der EVENT-Struktur entnehmen.
  445.  
  446.             Accessories sollten bei Eintreffen der Nachricht AC_CLOSE
  447.             den Aufruf von xfsl_exit nicht vergessen! Gleiches gilt
  448.             analog für die Nachricht AP_TERM.
  449.  
  450.  xFS_POPUP  Am User-Popup (sofern vorhanden) wurde ein Veränderung
  451.             vorgenommen. Bei dem Popup-Eintrag, der geändert wurde,
  452.             ist im Element 'fontflags' das Bit FF_CHANGED gesetzt.
  453.             Der Popup-Eintrag, der jetzt angewählt wurde und bei
  454.             Rückkehr in den Fontselektor (beim nächsten xfsl_event-
  455.             Aufruf) der aktuelle des Popups sein wird, steht im Ele-
  456.             ment 'sel_entry'.
  457.  
  458.             Sie haben jetzt noch die Möglichkeit, Änderungen an den
  459.             Popup-Einträgen vorzunehmen, beispielsweise die Fontflags
  460.             zu ändern oder den geänderten Font in alle anderen Popup-
  461.             Einträge zu übernehmen (auf diese Weise ist es auch mög-
  462.             lich, das Popup für eine andere Information zu verwenden,
  463.             die mit den ausgewählten Fonts nichts zu tun hat). Die
  464.             Texte und die Anzahl der Popup-Einträge dürfen aber nicht
  465.             verändert werden!
  466.  
  467.  andere Werte: Andere positive Werte sollten ignoriert werden. Es ist
  468.             möglich, daß die Schnittstelle um weitere Rückgabewerte
  469.             (Ereignisse) erweitert wird.
  470.  
  471.             Negative Werte zeigen einen Fehler an, der Fontselektor
  472.             sollte dann abgebrochen werden. Dazu muß aber unbedingt
  473.             noch xfsl_exit aufgerufen werden!
  474.  
  475.  
  476. 1.3.3 xfsl_exit
  477.  
  478. Mit dem xfsl_exit-Aufruf wird der Fontselektor wieder vom Bildschirm
  479. entfernt:
  480.  
  481.     void xfsl_exit(int xhandle);
  482.  
  483. Dabei ist 'xhandle' wieder das Handle des Fontselektors, wie es von
  484. xfsl_init geliefert wurde.
  485.  
  486. xfsl_exit muß immer dann aufgerufen werden, wenn die Behandlung des
  487. Fontselektors beendet werden soll. Sei es dadurch, daß ein Font ausge-
  488. wählt oder "Abbruch" angewählt wurde, oder daß xfsl_event einen Feh-
  489. ler meldete. Wenn schon der xfsl_init-Aufruf fehlgeschlagen ist, darf
  490. xfsl_exit nicht aufgerufen werden (logisch, da man ja auch kein gül-
  491. tiges Handle hat).
  492.  
  493. Der Aufruf von xfsl_exit sollte auch bei Eintreffen der Nachrichten
  494. AC_CLOSE und AP_TERM nicht vergessen werden!
  495.  
  496.  
  497. 1.4 Der Info-Aufruf (xfsl_info)
  498. -------------------------------
  499.  
  500. Über diesen Aufruf können einige der Features des installierten Font-
  501. selektors abgefragt werden:
  502.  
  503.     long xfsl_info(void);
  504.  
  505. Wenn der Rückgabewert positiv ist, dann stehen die folgenden Flags
  506. für vorhandene Features (negative Rückgabewerte sind, wie üblich,
  507. Fehlermeldungen):
  508.  
  509.      Name         Wert     Bedeutung
  510.     --------------------------------------------------------
  511.      XF_SIZE      0x0001   Größenänderung möglich
  512.      XF_COLOR     0x0002   Farbänderung möglich
  513.      XF_ATTR      0x0004   Attributänderung möglich
  514.      XF_WIDTH     0x0008   Breitenänderung möglich
  515.      XF_KERN      0x0010   Kerningänderung möglich
  516.      XF_SKEW      0x0020   Neigungsänderung möglich
  517.      XF_ALIGN     0x0040   Änderung der Ausrichtung möglich
  518.      XF_ROTATION  0x0080   Textrotation möglich
  519.      XF_FIX31     0x0100   fix31-Unterstützung
  520.      XF_POPUP     0x0200   Popup-Unterstützung
  521.      XF_DRAGDROP  0x0400   Drag&Drop-Unterstützung
  522.      XF_MAPPING   0x0800   beherrscht Mapping
  523.  
  524. Weitere Features des Fontselektors lassen sich indirekt über das Ele-
  525. ment 'control' der xFSL_PAR-Struktur abfragen: Bei einem erfolg-
  526. reichen xfsl_init-Aufruf werden diejenigen Kontrollflags gelöscht,
  527. die der Fontselektor nicht kennt.
  528.  
  529.  
  530. 1.5 Die VDI-Workstation
  531. -----------------------
  532.  
  533. Bei den Aufrufen xfsl_input und xfsl_init kann jeweils das Handle
  534. einer vom Aufrufer bereits geöffneten virtuellen VDI-Workstation
  535. übergeben werden. Davon, ob man tatsächlich ein Handle einer Work-
  536. station oder einfach eine Null übergibt, hängt das weitere Verhalten
  537. des Fontselektors ab:
  538.  
  539. Übergibt man ein gültiges Handle, so wird der Fontselektor versuchen,
  540. den auf der entsprechenden Workstation gerade aktuellen Font zu er-
  541. mitteln und diesen dann - sofern er zu den übergebenen Fontflags paßt
  542. - auch einstellen und zur Auswahl anbieten. Paßt der aktuelle Font
  543. nicht zu den Fontflags (wenn z.B. nur Vektorfonts angeboten werden
  544. sollen, der aktuelle Font aber ein Bitmapfont ist), so wird der Font-
  545. selektor einen Font aus den tatsächlich angebotenen auswählen und als
  546. aktuellen Font präsentieren.
  547.  
  548. Wählt der Anwender nun einen Font aus und beendet den Fontselektor
  549. mit "OK", so wird dieser Font auch gleich auf der übergebenen Work-
  550. station eingestellt, so daß das aufrufende Programm dies nicht mehr
  551. übernehmen muß.
  552.  
  553. Dabei gilt es zu beachten, daß der Fontselektor ebenfalls eine eigene
  554. VDI-Workstation öffnet und diese intern und zur Auswahl der Fonts
  555. verwendet. U.a. wird er für diese Workstation auch vst_load_fonts()
  556. aufrufen (sofern ein GDOS installiert ist). Dies kann zu unerwarteten
  557. Resultaten führen, wenn auf der übergebenen Workstation noch kein
  558. vst_load_fonts() aufgerufen wurde und der Anwender im Fontselektor
  559. einen Font auswählt, der erst nach einem vst_load_fonts()-Aufruf zur
  560. Verfügung steht!
  561.  
  562.  
  563. Statt eines Workstation-Handles kann man aber auch einfach eine Null
  564. übergeben. Der Fontselektor wird den aktuellen Font dann aus den
  565. übergebenen Parametern (beim xfsl_input-Aufruf) bzw. aus der xFSL_PAR-
  566. Struktur (beim xfsl_init-Aufruf) ermitteln.
  567.  
  568. Der ausgewählte Font wird dann (logischerweise) auch nur in den Para-
  569. metern bzw. der xFSL_PAR-Struktur zurückgegeben und der Aufrufer muß
  570. ihn dann selbst einstellen.
  571.  
  572.  
  573. 1.6 Die xFSL_PAR-Struktur
  574. -------------------------
  575.  
  576. Über diese Struktur haben Sie weitgehenden Einfluß auf das Verhalten
  577. des Fontselektors und die Art der dargestellten Fonts. Daher fällt
  578. die Beschreibung der Möglichkeiten auch etwas länger aus ...
  579.  
  580.     typedef struct
  581.     {
  582.      int            par_size;    /* Größe der xFSL_PAR-Struktur   */
  583.      int            pfi_size;    /* Größe der PFONTINFO-Struktur  */
  584.      unsigned long  control;     /* Kontrollflags                 */
  585.      const char    *headline;    /* Überschrift oder 0L           */
  586.      const char    *example;     /* Beispieltext oder 0L          */
  587.      const char    *helptext;    /* Text des Hilfe-Buttons od. 0L */
  588.      PFONTINFO     *font;        /* Zeiger auf Fontinfo-Struktur  */
  589.      unsigned int   fontflags;   /* erlaubte Fontarten            */
  590.      const char    *poptext;     /* Text vor dem Popup oder 0L    */
  591.      int            num_entries; /* Anzahl der Einträge (0..n)    */
  592.      int            sel_entry;   /* Selektierter Eintrag (0..n-1) */
  593.      xFSL_PENTRY   *popup;       /* Zeiger auf ein Popup oder 0L  */
  594.      char          *helpinfo;    /* Zeiger auf Hilfedatei/-seite  */
  595.     } xFSL_PAR;
  596.  
  597. Trotz der Vielzahl der Einträge ist eigentlich alles ganz einfach,
  598. zumal Sie Felder, die Sie nicht benötigen oder deren Bedeutung Ihnen
  599. noch nicht klar ist, einfach mit Null ausfüllen können, worauf der
  600. Fontselektor dann sinnvolle Defaultwerte annehmen wird.
  601.  
  602. Die Felder im einzelnen:
  603.  
  604.  par_size   Dieses Feld darf nicht auf Null gesetzt werden, hier wird
  605.             die Größe der xFSL_PAR-Struktur in Bytes eingetragen,
  606.             weshalb man in C einfach schreiben kann
  607.  
  608.                 xpar.par_size=sizeof(xFSL_PAR);
  609.  
  610.             Die Größe der Struktur beträgt z.Z. 42 Bytes. Sollte die
  611.             Struktur erweitert werden, kann der Fontselektor an der
  612.             Größenangabe erkennen, ob er es mit einer neuen oder
  613.             einer alten Struktur zu tun hat.
  614.  
  615.  pfi_size   Auch dieses Feld darf nicht Null sein, hier muß die Größe
  616.             der PFONTINFO-Struktur eingetragen werden, also
  617.  
  618.                 xpar.pfi_size=sizeof(PFONTINFO);
  619.  
  620.             Die aktuelle Größe der PFONTINFO-Struktur beträgt 38
  621.             Bytes und könnte ebenfalls in Zukunft erweitert werden.
  622.  
  623.  control    Dies sind die sogenannten Kontrollflags, über die das Ver-
  624.             halten des Fontselektors beeinflußt werden kann (z.B. ob
  625.             er als Fenster oder als Dialog erscheinen soll).
  626.  
  627.             Diesen Flags wurde ein eigener Abschnitt gewidmet.
  628.  
  629.  headline   Dies ist, wie schon vom einfachen Aufruf her bekannt, ein
  630.             Zeiger auf eine Überschrift für den Fontselektor. Fehlt
  631.             diese (d.h. 'headline' enthält Null), dann wird der Font-
  632.             selektor eine Default-Überschrift einsetzen.
  633.  
  634.             Die Länge der Überschrift sollte sich in dem noch vom
  635.             UFSL vorgegebenen Rahmen (34 Zeichen) bewegen, der Fontse-
  636.             lektor wird längere Überschriften aber ggfs. kürzen.
  637.  
  638.  example    Ein Zeiger auf einen Beispieltext. Der Fontselektor zeigt
  639.             für den jeweils eingestellten Font ein Schriftbeispiel
  640.             an, dessen Text hiermit vorgegeben werden kann. Fehlt
  641.             dieser Text (d.h. 'example' enthält Null), wird der Font-
  642.             selektor einen Defaulttext anzeigen (z.B. den Namen des
  643.             jeweiligen Zeichensatzes).
  644.  
  645.  helptext   Dies ist der Text für einen Button, der links unten im
  646.             Fontselektor eingeblendet werden kann. Im Normalfall wird
  647.             man dort einen Button mit der Aufschrift "Hilfe" oder
  648.             "Help" einblenden wollen, um dem Anwender die Funktion
  649.             des Fontselektors zu erklären, und wofür der ausgewählte
  650.             Font verwendet wird.
  651.  
  652.             Fehlt dieser Text (d.h. 'helptext' enthält Null), wird
  653.             auch kein Hilfe-Button eingeblendet. Dann wird xfsl_event
  654.             auch nicht den Rückgabewert xFS_HELP liefern.
  655.  
  656.             Man sollte einen kurzen Text wählen (etwa 8 Zeichen), der
  657.             Fontselektor wird längere Texte aber ggfs. kürzen.
  658.  
  659.  font       Dies ist ein Zeiger auf eine Struktur (PFONTINFO), die
  660.             einen Font beschreibt. Die Struktur wird sowohl zur Über-
  661.             gabe von Werten an den Fontselektor als auch zur Rückgabe
  662.             des ausgewählten Fonts verwendet.
  663.  
  664.             Auch dieser Struktur ist ein eigener Abschnitt gewidmet.
  665.  
  666.  fontflags  Dies sind wieder die vom einfachen Aufruf bekannten Font-
  667.             flags, mit denen Sie die zur Auswahl gestellten Fonts
  668.             beeinflußen können.
  669.  
  670.  poptext, num_entries, sel_entry, popup: Mit diesen vier Parametern
  671.             können Sie ein zusätzliches Popup in den Fontselektor
  672.             einblenden lassen. Wegen der vielfältigen Möglichkeiten
  673.             gibt's dafür auch wieder einen eigenen Abschnitt.
  674.  
  675.             Wollen Sie kein Popup, so setzen Sie diese vier Werte
  676.             einfach auf Null.
  677.  
  678.  helpinfo   Dies ist ein reiner Ausgabeparameter: Wenn der Hilfe-
  679.             Button angewählt wurde (sofern vorhanden, siehe 'help-
  680.             text'), dann steht hier ein Zeiger auf einen Dateinamen
  681.             einer Hilfedatei und den Namen einer Seite, die angezeigt
  682.             werden kann. Der Dateiname wird ohne Pfad und Extension
  683.             angegeben, der Seitenname folgt direkt dahinter, durch
  684.             ein Komma getrennt.
  685.  
  686.                 Der String darf nur gelesen, aber nicht verändert
  687.                 werden!
  688.  
  689.             Wenn Sie bei xFS_HELP nicht selbst eine Hilfe anzeigen
  690.             wollen, dann können Sie mit diesen Informationen ein
  691.             Hilfesystem (z.B. ST-Guide) aufrufen.
  692.  
  693.             Beispiel: xfsl_event gibt xFS_HELP zurück, in 'helpinfo'
  694.             findet sich ein Zeiger auf den String
  695.  
  696.                 toll,Der tollste Fontselektor aller Zeiten
  697.  
  698.             Daraus läßt sich dann folgender Aufruf für ST-Guide
  699.             erstellen:
  700.  
  701.                 *:\toll.hyp Der tollste Fontselektor aller Zeiten
  702.  
  703.             Man hängt also an den Dateinamen die Extension für das
  704.             jeweilige Hilfesystem an und übergibt den Teil nach dem
  705.             ersten Komma als Seitenname.
  706.  
  707.  
  708. Um es nochmals zu betonen: Felder, die sie nicht benötigen oder noch
  709. nicht verstehen, können Sie zunächst einfach auf Null setzen. Aus-
  710. nahmen sind nur
  711.  
  712.    ∙ 'par_size', die Größe der xFSL_PAR-Struktur selbst
  713.  
  714.    ∙ 'pfi_size', die Größe der PFONTINFO-Struktur
  715.  
  716.    ∙ 'font', der Zeiger auf die PFONTINFO-Struktur
  717.  
  718.  
  719. 1.6.1 Die Kontrollflags
  720.  
  721. Über die Kontrollflags kann das Verhalten des Fontselektors beein-
  722. flußt werden.
  723.  
  724.      Name           Wert    Bedeutung
  725.     --------------------------------------------------------------
  726.      CC_WINDOW      0x0001  Fontselektor als Fenster
  727.      CC_APPMODAL    0x0002  Fontselektor ist applikationsmodal
  728.      CC_FIX31       0x0004  alle Größenangaben in 1/65536 Punkt
  729.      CC_FAKESTYLE   0x0008  Schnitte simulieren (nur Bitmapfonts)
  730.      CC_CLOSER      0x0010  Fenster mit Closer, kein OK-Button
  731.      CC_NOSIZE      0x0100  Größe nicht ändern
  732.      CC_NOCOLOR     0x0200  Farbe nicht ändern
  733.      CC_NOATTR      0x0400  Attribute nicht ändern
  734.      CC_NOWIDTH     0x0800  Breite nicht ändern
  735.      CC_NOKERN      0x1000  Kerning nicht ändern
  736.      CC_NOSKEW      0x2000  Skewing nicht ändern
  737.      CC_NOALIGN     0x4000  Ausrichtung nicht ändern
  738.      CC_NOROTATION  0x8000  Textrotation nicht ändern
  739.      CC_DFLTSIZE   0x10000  Schriftgröße "Default"
  740.      CC_INVSTYLE   0x20000  Attribut "Invers"
  741.  
  742. Die Funktion der einzelnen Flags sollte sich schon aus den Namen und
  743. den Kurzbeschreibungen ergeben. Hier noch einige Anmerkungen:
  744.  
  745.    ∙ CC_APPMODAL
  746.      "Applikationsmodal" heißt, daß das Programm in einen Modus ver-
  747.      setzt wird, in dem nur noch der Fontselektor bearbeitet werden
  748.      kann. Im wesentlichen bedeutet das, daß der Fontselektor alle
  749.      WM_TOPPED-Nachrichten für andere Fenster des aufrufenden Pro-
  750.      gramms abfängt und nicht weiterleitet, sondern sich stattdessen
  751.      selbst zum obersten Fenster macht. Damit soll dem Anwender signa-
  752.      lisiert werden, daß er zuerst den Fontselektor bearbeiten soll,
  753.      bevor er eine andere Aktion im Programm auslösen kann.
  754.  
  755.      Der Aufrufer sollte in diesem Modus natürlich darauf verzichten,
  756.      eigene Fenster selbst mit wind_set(WF_TOP) zum obersten Fenster
  757.      zu machen.
  758.  
  759.    ∙ CC_FAKESTYLE
  760.      Dies ist eine Spezialität, die z.Z. nur Calvino anbietet: Bei
  761.      denjenigen Bitmapfonts, bei denen keine leichten, kursiven bzw.
  762.      fetten Schnitte vorliegen, werden die jeweils fehlenden Schnitte
  763.      mit der VDI-Funktion vst_effects() simuliert.
  764.  
  765.    ∙ CC_CLOSER
  766.      Wenn dieses Flag und CC_WINDOW gesetzt sind, wird der Fontselek-
  767.      tor mit einem Closer versehen, während der OK- und der Abbruch-
  768.      Button versteckt werden. Gedacht ist dies für die Fälle, in
  769.      denen der Fontselektor als reiner Drag&Drop-Selektor eingesetzt
  770.      werden soll.
  771.  
  772.    ∙ CC_NO...
  773.      Über diese Flags kann bestimmt werden, welche Einstellungen
  774.      nicht verändert werden sollen. Beispielsweise könnte ein Pro-
  775.      gramm verhindern wollen, daß die Größe eines Zeichensatzes geän-
  776.      dert wird, während eine Änderung des Fonts selbst ermöglicht
  777.      werden soll. Dann muß der Aufrufer nur das Flag CC_NOSIZE
  778.      setzen.
  779.  
  780.      Beachten Sie aber, daß Sie trotz gesetztem CC_NO...-Flag immer
  781.      einen gültigen Wert übergeben müssen. Die Bedeutung dieser Flags
  782.      ist also, daß die vorgegebenen Werte nicht verändert werden
  783.      können und nicht, daß die Werte nicht von Interesse sind.
  784.  
  785. Bitte beachten: Nicht alle Fontselektoren unterstützen auch alle
  786. Kontrollflags! Wenn ein Fontselektor ein Flag nicht unterstützt, so
  787. wird er es einfach ignorieren. Bei einem erfolgreichen(!) xfsl_init-
  788. Aufruf wird der Fontselektor diejenigen Flags im Element 'control'
  789. der xFSL_PAR-Struktur löschen, die er nicht versteht.
  790.  
  791.  
  792. 1.6.2 Die PFONTINFO-Struktur
  793.  
  794. Diese Struktur beschreibt einen Font. Sie enthält nach dem Aufruf des
  795. Fontselektors den ausgewählten Font. Zudem werden diese Angaben vom
  796. Fontselektor schon beim Aufruf ausgewertet (und der so beschriebene
  797. Font angezeigt), wenn als VDI-Handle eine Null übergeben wird.
  798.  
  799.     typedef struct
  800.     {
  801.      int          fontid;     /* ID des Fonts                  */
  802.      int          fonttype;   /* Typ des Fonts                 */
  803.      char        *fontname;   /* Name des Fonts                */
  804.      union fsize  fontsize;   /* Fontgröße in pt oder fix31    */
  805.      union fsize  fontwidth;  /* Breite in pt oder fix31       */
  806.      char         trackkern;  /* Track-Kerning                 */
  807.      char         pairkern;   /* Paar-Kerning                  */
  808.      int          fontattr;   /* Attribute                     */
  809.      int          fontskew;   /* Neigung                       */
  810.      int          fontcol;    /* Farbe                         */
  811.      int          backcol;    /* Text-Hintergrundfarbe         */
  812.      int          halign;     /* horizontale Textausrichtung   */
  813.      int          valign;     /* vertikale Textausrichtung     */
  814.      int          rotation;   /* Textrotation in 1/10 Grad     */
  815.      int          validtype;  /* Typ (V_CHAR_...) oder Mapping */
  816.      int         *validchars; /* benötigte Zeichen oder 0L     */
  817.     } PFONTINFO;
  818.  
  819. Die Elemente im einzelnen:
  820.  
  821.  fontid     Die ID des Fonts, wie sie auch von der VDI-Funktion
  822.             vqt_name() zurückgegegeben wird. Die Font-ID ist eine
  823.             Zahl ungleich Null (kann also auch negativ sein).
  824.  
  825.  fonttype   Der Typ des Fonts, wie er ab Speedo 5 bzw. NVDI 3 verwen-
  826.             det wird:
  827.  
  828.                  Name         Wert    Fontart
  829.                 ------------------------------------------
  830.                  BITMAP_FONT  0x0001  Pixel
  831.                  SPEEDO_FONT  0x0002  Speedo
  832.                  TT_FONT      0x0004  TrueType
  833.                  PFB_FONT     0x0008  Type 1 (Postscript)
  834.  
  835.             Diese Angaben sind z.Z. nur zur Information, aber ohne
  836.             Bedeutung für den Fontselektor. Allerdings wird es künf-
  837.             tig möglich sein, einen Font nicht nur anhand seiner ID,
  838.             sondern auch anhand seines Namens zu setzen, wobei dann
  839.             noch zusätzlich der Fonttyp benötigt wird.
  840.  
  841.             Der Fonttyp ist aber auch von Interesse, wenn man die
  842.             Größe des Fonts ändern will: Bei Bitmapfonts geschieht
  843.             dies mit der VDI-Funktion vst_point(), bei allen anderen
  844.             Typen (Vektorfonts) mit der Funktion vst_arbpt().
  845.  
  846.  fontname   Der Name des Fonts, wie er von vqt_name() geliefert wurde
  847.             (möglicherweise wurden mehrfache Leerzeichen entfernt).
  848.  
  849.             Der Aufrufer muß selbst genügend Platz für den Fontnamen
  850.             zur Verfügung stellen, also für 32 Zeichen und ein Null-
  851.             byte! Wenn Sie den Fontnamen nicht benötigen, können Sie
  852.             den Zeiger auch einfach auf Null setzen.
  853.  
  854.  fontsize   Die Größe des Fonts in Punkt (pt) oder 1/65536 Punkt (Typ
  855.             "fix31"):
  856.  
  857.                 union fsize
  858.                 {
  859.                  int   size;    /* Fontgröße in Punkt         */
  860.                  fix31 size31;  /* Fontgröße in 1/65536 Punkt */
  861.                 };
  862.  
  863.             Welche der beiden Angaben gültig ist, wird global über
  864.             das Kontrollflag CC_FIX31 geregelt.
  865.  
  866.  fontwidth  Breite des Fonts in Punkt (pt) oder 1/65536 Punkt (Typ
  867.             "fix31"):
  868.  
  869.                 union fsize
  870.                 {
  871.                  int   size;    /* Fontgröße in Punkt         */
  872.                  fix31 size31;  /* Fontgröße in 1/65536 Punkt */
  873.                 };
  874.  
  875.             Welche der beiden Angaben gültig ist, wird global über
  876.             das Kontrollflag CC_FIX31 geregelt.
  877.  
  878.             Die Breite kann mit den VDI-Funktionen vst_width() in
  879.             Punkt und mit vst_setsize() in fix31 eingestellt werden.
  880.  
  881.  trackkern  Dieser Parameter gibt die Art des Track-Kernings für
  882.             vst_kern() an. Gültige Werte sind:
  883.  
  884.                  Wert Kerning
  885.                 -------------------------
  886.                    0  kein Kerning
  887.                    1  normales Kerning
  888.                    2  enges Kerning
  889.                    3  sehr enges Kerning
  890.  
  891.  pairkern   Mit diesem Parameter kann das Pair-Kerning aus- (0) oder
  892.             eingeschaltet (1) werden, vgl. vst_kern().
  893.  
  894.  fontattr   Dies sind die Fontattribute (Texteffekte), wie sie auch
  895.             von der VDI-Funktion vst_effects() verwendet werden.
  896.  
  897.             Calvino verwendet dieses Feld nur dann, wenn das Kontroll-
  898.             flag CC_FAKESTYLE gesetzt ist.
  899.  
  900.  fontskew   Die Neigung des Fonts in 1/10 Grad, vgl. vst_skew().
  901.  
  902.  fontcol    Die Farbe des Fonts. Es werden die VDI-Farben verwendet,
  903.             d.h. 0 = Weiß, 1 = Schwarz, usw., vgl. vst_color().
  904.  
  905.  backcol    Die Hintergrundfarbe des Textes. Es werden die VDI-Farben
  906.             verwendet, d.h. 0 = Weiß, 1 = Schwarz, usw. Das Setzen
  907.             einer Text-Hintergrundfarbe wird vom VDI nicht direkt
  908.             unterstützt, es obliegt daher dem Aufrufer, ob und wie
  909.             dieser Parameter verwendet wird.
  910.  
  911.  halign     Hierüber kann die horizontale Textausrichtung angegeben
  912.             werden: Der Text soll linksbündig, rechtsbündig oder
  913.             zentriert ausgegeben werden.
  914.  
  915.                Name        Wert Ausrichtung
  916.               -------------------------------
  917.                THA_LEFT     0   linksbündig
  918.                THA_CENTER   1   zentriert
  919.                THA_RIGHT    2   rechtsbündig
  920.  
  921.             Diese Werte entsprechen dem Parameter für die horizontale
  922.             Ausrichtung beim VDI-Aufruf vst_alignment().
  923.  
  924.  valign     Hierüber kann die vertikale Textausrichtung angegeben
  925.             werden: Der Text soll an der Oberkante oder der Unterkan-
  926.             te ausgerichtet oder (vertikal) zentriert ausgegeben wer-
  927.             den.
  928.  
  929.                Name        Wert Ausrichtung
  930.               -----------------------------------------
  931.                TVA_BOTTOM   0   an der Text-Unterkante
  932.                TVA_CENTER   1   vertikal zentriert
  933.                TVA_TOP      2   an der Text-Oberkante
  934.  
  935.             Diese Werte entsprechen absichtlich nicht dem Parameter
  936.             zur vertikalen Ausrichtung bei vst_alignment()! Die dort
  937.             verwendeten Werte ("Zeichenunterkante", "Zeichenzellen-
  938.             unterkante") sind für den normalen Anwender wenig intui-
  939.             tiv und sollten daher nicht Teil des User-Interfaces sein
  940.             (was sie bei der Auswahl im Fontselektor aber wären). Die
  941.             Ausrichtung muß daher vom aufrufenden Programm in die
  942.             "richtigen" Werte konvertiert werden.
  943.  
  944.  rotation   Textrotation in 1/10 Grad, wie sie auch von der VDI-Funk-
  945.             tion vst_rotation() verwendet wird.
  946.  
  947.  
  948. Fehlen noch die beiden Parameter 'validtype' und 'validchars':
  949.  
  950. Manchmal ist es wichtig, sicherzustellen, daß der Font bestimmte Zei-
  951. chen enthält. Dafür gibt es zwei Möglichkeiten:
  952.  
  953. Wenn 'validchars' Null ist, kann man mit 'validtype' eine der folgen-
  954. den vier Gruppen von Zeichen auswählen:
  955.  
  956.    Name       Wert Bereich  Kommentar
  957.   --------------------------------------------------------
  958.    V_CHAR_IND  -1    -      "egal"
  959.    V_CHAR_ASC  -2  32-126   alle druckbaren ASCII-Zeichen
  960.    V_CHAR_PRT  -3  32-255   alle druckbaren Zeichen
  961.    V_CHAR_ALL  -4   0-255   wirklich alle Zeichen
  962.  
  963. Diese vier Gruppen dürften die häufigsten Anwendungsfälle abdecken.
  964.  
  965. Wenn sowohl 'validtype' als auch 'validchars' Null sind, wird der
  966. Fontselektor dies wie V_CHAR_IND behandeln, ebenso bei anderen ungül-
  967. tigen Werten in 'validtype'.
  968.  
  969.  
  970. Wenn die vier Gruppen einmal nicht ausreichen, so kann man statt-
  971. dessen über 'validtype' und 'validchars' auch genauer angeben, welche
  972. Zeichen benötigt werden:
  973.  
  974.  validtype enthält dann einen Wert für das vom GDOS zu verwendende
  975.     Mapping (vgl. vst_charmap()).
  976.  
  977.     Die freie Wahl des Mappings steht nur mit einem entsprechenden
  978.     GDOS (SpeedoGDOS oder NVDI ab Version 3) zur Verfügung. Z.Z. sind
  979.     folgende Mappings definiert:
  980.  
  981.      Name       Wert Bedeutung
  982.     -----------------------------------------
  983.      MAP_DIRECT  0   "direktes Mapping"
  984.      MAP_ASCII   1   ASCII-Mapping (Default)
  985.  
  986.     Wenn das GDOS kein Mapping beherrscht, wird der Fontselektor nur
  987.     MAP_ASCII akzeptieren, alle anderen Mappings werden dann igno-
  988.     riert und ein Test auf Vorhandensein bestimmter Zeichen wird
  989.     nicht durchgeführt.
  990.  
  991.  validchars ist ein Zeiger auf ein Array von Integers (Words), über
  992.     das angegeben werden kann, welche Zeichen der Font unbedingt
  993.     enthalten soll.
  994.  
  995.     Das Array besteht aus einer Folge von Von-Bis-Paaren:
  996.  
  997.       - zwei aufeinanderfolgende Werte geben einen Bereich (von-bis)
  998.         an
  999.  
  1000.       - einzelne Zeichen werden durch Verdopplung angegeben
  1001.  
  1002.       - das Ende der Liste wird durch ein Von-Bis-Paar angegeben, bei
  1003.         dem 'bis' kleiner ist als 'von'
  1004.  
  1005.     Beispiel: Es sollen nur Fonts angeboten werden, die alle druck-
  1006.     baren ASCII-Zeichen sowie die deutschen Umlaute enthalten.
  1007.  
  1008.     xFSL_PAR xpar;
  1009.     int chars[] = { ' ', '~',  /* ASCII 32..126 */
  1010.                     'ä','ä', 'ö','ö', 'ü','ü',
  1011.                     'Ä','Ä', 'Ö','Ö', 'Ü','Ü', 'ß','ß',
  1012.                     1,0       /* Ende der Liste */
  1013.                   };
  1014.     
  1015.     xpar.font->validtype=MAP_ASCII;
  1016.     xpar.font->validchars=chars;
  1017.  
  1018. Zukünftige GDOSse werden wahrscheinlich weitere Mappings unterstützen
  1019. (BICS, Unicode, ...). Durch die verwendete Codierung wird der Fontse-
  1020. lektor auch diese korrekt beherrschen: Das in 'validtype' übergebene
  1021. Mapping wird einfach eingestellt und dann das Vorhandensein der Zei-
  1022. chen aus 'validchars' abgetestet.
  1023.  
  1024. Anmerkung: Die diversen Möglichkeiten mit den Parametern 'validtype'
  1025. und 'validchars' sollten sparsam und mit Bedacht verwendet werden, da
  1026. das notwendige Testen der Zeichen je nach GDOS recht lange dauern
  1027. kann.
  1028.  
  1029.  
  1030. 1.6.3 Das User-Popup
  1031.  
  1032. Für das benutzerdefinierte Popup (kurz User-Popup) existieren die fol-
  1033. genden Felder in der xFSL_PAR-Struktur:
  1034.  
  1035.  poptext      Zeiger auf einen Text, der vor dem Popup erscheinen
  1036.               soll oder 0L. Dem Fontselektor steht es frei, diesen
  1037.               Text zu ignorieren.
  1038.  
  1039.  num_entries  Anzahl Einträge (d.h. Zeilen) im Popup. Steht hier eine
  1040.               Null, so wird kein Popup angezeigt. Es sollten nicht
  1041.               mehr als 16 Einträge verwendet werden, auch wenn einzel-
  1042.               ne Fontselektoren u.U. auch mehr Einträge unterstützen.
  1043.  
  1044.  sel_entry    Der selektierte Eintrag im Popup (gezählt wird ab 0).
  1045.               Der Fontselektor legt hier die Nummer des angewählten
  1046.               Popup-Eintrags ab und liest den Wert bei jedem Aufruf
  1047.               von xfsl_event wieder neu aus. Somit können Sie den
  1048.               Fontselektor z.B. auch zwingen, statt dem angewählten
  1049.               Eintrag Nummer 3 den mit der Nummer 5 zu aktivieren
  1050.               (bei xFS_POPUP meldet der Fontselektor nur, welcher
  1051.               Eintrag angewählt wurde, aktiviert wird dieser erst
  1052.               beim Rücksprung in den Fontselektor).
  1053.  
  1054.  popup        Dies ist ein Zeiger auf ein Array von xFSL_PENTRY-Ele-
  1055.               menten. An der angegebenen Adresse müssen genau so
  1056.               viele Elemente stehen, wie in 'num_entries' angegeben
  1057.               wurden.
  1058.  
  1059. Ein Eintrag im Popup ist wie folgt aufgebaut:
  1060.  
  1061.     typedef struct
  1062.     {
  1063.      char         *entry;      /* Text des Popup-Eintrags       */
  1064.      PFONTINFO    *fontinfo;   /* Zeiger auf Fontinfo-Struktur  */
  1065.      unsigned int  fontflags;  /* erlaubte Fontarten            */
  1066.      long          funcflags;  /* Funktionsflags, nur für HuGo! */
  1067.     } xFSL_PENTRY;
  1068.  
  1069. Die Bedeutung der Elemente dieser Struktur sollte nach den vorangegan-
  1070. genen Ausführungen klar sein. Die Funktionsflags entsprechen den
  1071. Kontrollflags, bis auf die Flags, die das globale Verhalten des Font-
  1072. selektors beeinflußen (CC_WINDOW etc.). Diese werden hier ignoriert.
  1073.  
  1074. Wichtig: Der Zeiger auf die PFONTINFO-Struktur darf nicht Null sein!
  1075.  
  1076. Wenn der Text eines Eintrags mit einem '-' beginnt, wird der ent-
  1077. sprechende Eintrag disabled (in heller Schrift und nicht anwählbar)
  1078. dargestellt. Dies ist in erster Linie für Trennlinien zwischen den
  1079. Einträgen gedacht.
  1080.  
  1081.  
  1082. Verwendung
  1083.  
  1084. Im Prinzip kann man drei Einsatzgebiete für das User-Popup sehen:
  1085.  
  1086.   1. Jeder Popup-Eintrag stellt den Font für einen bestimmten Pro-
  1087.      grammteil ein. Beispielsweise könnte man in einem bestimmten Fen-
  1088.      ster eines Programms nur nicht-proportionale Fonts zulassen wol-
  1089.      len, in einem anderen keine Vektorfonts, in einem dritten alle
  1090.      Fonts.
  1091.  
  1092.   2. Jeder Eintrag stellt eine gewisse Gruppe von Fonts zur Verfü-
  1093.      gung. Braucht man beispielsweise oft Vektorfonts, könnte ein
  1094.      Popup mit den Einträgen "nur Vektorfonts" und "alle Fonts" kon-
  1095.      struiert werden.
  1096.  
  1097.   3. Das Popup kann aber auch für etwas ganz anderes verwendet wer-
  1098.      den. Man könnte hier noch eine Information unterbringen, die
  1099.      zwar nichts mit Fonts, aber mit dem Fenster zu tun hat, für das
  1100.      man einen Font einstellen will. Beispielsweise könnte für ein
  1101.      Consolen-Fenster die Art, wie inverse Zeichen darzustellen sind,
  1102.      in Form eines Popups mit den Einträgen "invers", "fett", "unter-
  1103.      strichen" zur Auswahl angeboten werden.
  1104.  
  1105.      Will man das Popup so zweckentfremden, so muß man bei der Mel-
  1106.      dung xFS_POPUP den geänderten Font (zu erkennen am gesetzten
  1107.      FF_CHANGED-Flag) in alle anderen Popup-Einträge übertragen, da
  1108.      sich sonst der im Fontselektor angezeigte Font ändern würde!
  1109.  
  1110.  
  1111. 1.7 Die Fontflags
  1112. -----------------
  1113.  
  1114. Über die Fontflags können die zur Auswahl gestellten Fonts einge-
  1115. schränkt werden:
  1116.  
  1117.      Name             Wert    Bedeutung
  1118.     -----------------------------------------------------------
  1119.      FF_SYSTEM        0x0001  Systemfont (zusätzlich) anzeigen
  1120.      FF_MONOSPACED    0x0002  monospaced Fonts anzeigen
  1121.      FF_PROPORTIONAL  0x0004  proportionale Fonts anzeigen
  1122.      FF_BITMAP        0x0008  Bitmapfonts anzeigen
  1123.      FF_SPD           0x0010  Speedofonts anzeigen
  1124.      FF_TTF           0x0020  TrueType-Fonts anzeigen
  1125.      FF_PFB           0x0040  Type-1-Fonts anzeigen
  1126.      FF_CFN           0x0080  Calamusfonts anzeigen (n.i.)
  1127.      FF_VECTOR        0x00F0  alle Vektorfonts anzeigen
  1128.      FF_ALL           0x00FE  alle Fonts anzeigen
  1129.      FF_CHANGED       0x8000  Änderung erfolgt (nur im Popup)
  1130.  
  1131. Die Werte sind so gewählt, daß die einzelnen Flags miteinander ver-
  1132. odert werden können. Setzt man für die Fontflags also beispielsweise
  1133. FF_MONOSPACED|FF_VECTOR ein, so werden nur unproportionale Vektor-
  1134. fonts zur Auswahl gestellt.
  1135.  
  1136. Zudem gilt:
  1137.  
  1138.    ∙ FF_SYSTEM hat Vorrang, d.h. wenn dieses Flag gesetzt ist, wird
  1139.      der Systemfont auf jeden Fall mit zur Auswahl gestellt.
  1140.  
  1141.    ∙ Wenn FF_SYSTEM nicht gesetzt ist, wird der Systemfont genau dann
  1142.      zur Auswahl gestellt, wenn seine Eigenschaften den gesetzten
  1143.      Flags entsprechen.
  1144.  
  1145.    ∙ Wenn weder FF_MONOSPACED noch FF_PROPORTIONAL gesetzt sind,
  1146.      werden die Fontflags so behandelt, als seien beide Flags ge-
  1147.      setzt.
  1148.  
  1149.      Dies gilt analog für FF_VECTOR und FF_BITMAP.
  1150.  
  1151.    ∙ Wenn FF_VECTOR gesetzt wird, werden automatisch alle Vektorfont-
  1152.      Formate angeboten. Eine feinere Unterteilung ist aber auf Wunsch
  1153.      durch die Flags FF_SPD, ..., FF_CFN möglich.
  1154.  
  1155.      Bitte beachten: Calamus-Fonts (und somit das Flag FF_CFN) werden
  1156.      z.Z. noch von keinem GDOS unterstützt!
  1157.  
  1158.    ∙ Das Flag FF_CHANGED wird nur dazu verwendet, um im User-Popup
  1159.      die Einstellungen zu markieren, die sich geändert haben. Der
  1160.      Fontselektor setzt dieses Flag nur, wertet es aber selbst nicht
  1161.      aus.
  1162.  
  1163.  
  1164. 1.8 Returncodes
  1165. ---------------
  1166.  
  1167. Alle xFSL-Aufrufe liefern einheitliche Returncodes (Rückgabewerte)
  1168. zurück. Dabei steht eine negative Zahl für einen Fehler, eine posi-
  1169. tive Zahl (oder Null) bedeutet Erfolg bzw. ein Ereignis.
  1170.  
  1171.      Name            Wert Bedeutung
  1172.     ----------------------------------------------------------------
  1173.      xFS_PARERROR     -9  Parameterfehler, z.B. Aufruf nach Rev. 3
  1174.      xFS_LOADERROR    -8  Fehler beim Nachladen des xFSL-Moduls
  1175.      xFS_RES_ERROR    -7  Auflösung zu klein (mind. 640x400 Punkte)
  1176.      xFS_NO_HANDLE    -6  Kein VDI-Handle frei
  1177.      xFS_NO_WINDOW    -5  Kein Fenster(handle) frei
  1178.      xFS_NO_FONTS     -4  Keine Fonts geladen
  1179.      xFS_NO_FONTSIZE  -3  Fontgröße nicht identifizierbar
  1180.      xFS_ACTIVE       -2  Fontselektor ist bereits aktiv
  1181.      xFS_ERROR        -1  allgemeiner Fehler (Speichermangel o.ä.)
  1182.      xFS_STOP          0  <Abbruch> gewählt
  1183.      xFS_OK            1  <Ok> gewählt
  1184.      xFS_HELP          2  Hilfe-Button angewählt
  1185.      xFS_EVENT         3  AES-Event aufgetreten
  1186.      xFS_POPUP         4  Änderung am User-Popup
  1187.  
  1188. Diese Werte wurden aufwärtskompatibel zum Fontselektor UFSL gewählt
  1189. (dieser kennt die Returncodes -4, -3, -2, -1, 0 und 1).
  1190.  
  1191. Darüber hinaus können auch Gemdos-Fehlermeldungen (Werte kleiner oder
  1192. gleich -32) auftreten, insbesondere kann xfsl_init auch den Wert
  1193. EINVFN (-32) liefern, wenn der Fontselektor den erweiterten Aufruf
  1194. nicht unterstützt.
  1195.  
  1196. Beim Aufruf xfsl_init entsprechen positive Rückgabewerte dem Fenster-
  1197. handle des Fontselektors (0 bedeutet, daß der Fontselektor als mo-
  1198. daler Dialog geöffnet wurde).
  1199.  
  1200. Es ist möglich, daß die Liste der Returncodes in Zukunft um weitere
  1201. Fehler (Werte kleiner -9) oder Ereignisse (Werte größer 4) erweitert
  1202. wird. Dies sollte beim Programmentwurf berücksichtigt werden: Bei un-
  1203. bekannten Fehlern sollte abgebrochen, unbekannte Ereignisse sollten
  1204. ignoriert werden.
  1205.  
  1206.  
  1207. 1.9 Die Pure-C-Event-Struktur
  1208. -----------------------------
  1209.  
  1210. Die GEM-Bibliothek von Pure C verwendet eine spezielle Struktur, in
  1211. der die Parameter der AES-Funktion evnt_multi() zusammengefaßt sind.
  1212. Diese Struktur wird auch von xfsl_event verwendet.
  1213.  
  1214.     typedef struct /* Special type for EventMulti */
  1215.     {
  1216.      /* Eingabeparameter */
  1217.      int ev_mflags,
  1218.          ev_mbclicks, ev_bmask, ev_mbstate,
  1219.          ev_mm1flags, ev_mm1x, ev_mm1y, ev_mm1width, ev_mm1height,
  1220.          ev_mm2flags, ev_mm2x, ev_mm2y, ev_mm2width, ev_mm2height,
  1221.          ev_mtlocount, ev_mthicount;
  1222.     
  1223.      /* Ausgabeparameter */
  1224.      int ev_mwich,
  1225.          ev_mmox, ev_mmoy, ev_mmobutton, ev_mmokstate,
  1226.          ev_mkreturn, ev_mbreturn;
  1227.     
  1228.      /* Message-Buffer */
  1229.      int ev_mmgpbuf[8];
  1230.     } EVENT;
  1231.  
  1232. Die Elemente der Struktur entsprechen denen des evnt_multi()-Aufrufs.
  1233. Auch die Reihenfolge der Parameter ist - bis auf wenige Ausnahmen -
  1234. identisch. Das Feld 'ev_mwich' enthält die aufgetretenen Events in
  1235. der gleichen Kodierung wie 'ev_mflags'.
  1236.  
  1237.  
  1238.  
  1239. 2 Tips und Hinweise
  1240. ===================
  1241.  
  1242. In den folgenden Abschnitten soll versucht werden, noch einige Tips
  1243. und Hinweise zur xFSL-Schnittstelle zu geben.
  1244.  
  1245.  
  1246. 2.1 Ein einfacher Aufruf
  1247. ------------------------
  1248.  
  1249. Angesichts der Vielzahl der Parameter und Einstellmöglichkeiten er-
  1250. scheint folgender Hinweis angebracht:
  1251.  
  1252.                              Keine Panik!
  1253.  
  1254. Ein xFSL-Aufruf ist einfacher als es zunächst scheint. Insbesondere
  1255. kann hier die Strategie der "schrittweisen Verfeinerung" angewendet
  1256. werden, da man (fast) alle Parameter zunächst einmal auf Null setzen
  1257. kann.
  1258.  
  1259. Ein möglichst einfacher xFSL-Aufruf kann z.B. so aussehen:
  1260.  
  1261.     #include <stdio.h>
  1262.     #include <aes.h>
  1263.     #include <vdi.h>
  1264.     #include <xfsl.h>
  1265.     
  1266.     void call_xfsl(void)
  1267.     {
  1268.      int xhandle, xret;
  1269.      xFSL_PAR xpar;
  1270.      PFONTINFO pfont;
  1271.      xFSL *xfsl;
  1272.     
  1273.      memset(&xpar,0,sizeof(xFSL_PAR));
  1274.      memset(&pfont,0,sizeof(PFONTINFO));
  1275.     
  1276.      xpar.par_size=sizeof(xFSL_PAR);
  1277.      xpar.pfi_size=sizeof(PFONTINFO);
  1278.      xpar.font=&pfont;
  1279.      xpar.font->fontcol=BLACK;
  1280.     
  1281.      if(get_cookie('xFSL',&xfsl))
  1282.      {
  1283.       xhandle=xfsl->xfsl_init(0,&xpar);
  1284.       if(xhandle>=0)
  1285.       {
  1286.        do
  1287.          xret=xfsl->xfsl_event(xhandle,0L);
  1288.        while(xret>xFS_OK);
  1289.        xfsl->xfsl_exit(xhandle);
  1290.        if(xret==xFS_STOP) printf("Abbruch\n");
  1291.        else if(xret==xFS_OK)
  1292.          printf("Font mit ID %d ausgewählt\n",xpar.font->fontid);
  1293.        else if(xret<0) printf("Fehler %d\n",xret);
  1294.       }
  1295.       else printf("Fehler %d\n",xhandle);
  1296.      }
  1297.      else printf("Cookie nicht gefunden!\n");
  1298.     }
  1299.  
  1300. Mit den beiden memset-Aufrufen werden alle Elemente der Strukturen
  1301. xFSL_PAR und PFONTINFO auf Null gesetzt. Anschließend werden einige
  1302. unbedingt nötige Werte eingetragen:
  1303.  
  1304.    ∙ die Größen der beiden Strukturen xFSL_PAR und PFONTINFO
  1305.  
  1306.    ∙ die Adresse der PFONTINFO-Struktur wird in der xFSL_PAR-Struktur
  1307.      eingetragen
  1308.  
  1309.    ∙ die Schriftfarbe wird auf schwarz gesetzt (dies könnte man auch
  1310.      weglassen, aber normalerweise wird man ja in schwarzer Schrift
  1311.      auf weißem Grund schreiben wollen)
  1312.  
  1313. Mehr ist an Vorbereitungen nicht nötig, es folgt nun der eigentliche
  1314. Aufruf. Zunächst wird der xFSL-Cookie gesucht. Im Erfolgsfall wird
  1315. nun der Fontselektor initialisiert, indem die xFSL_PAR-Struktur über-
  1316. geben wird. War dieser Aufruf erfolgreich ('xhandle' ist größer oder
  1317. gleich Null), so befindet sich der Fontselektor bereits auf dem Bild-
  1318. schirm. In der Hauptschleife wird nun gewartet, bis der Fontselektor
  1319. entweder mit xFS_STOP oder xFS_OK vom Anwender beendet wird oder bis
  1320. ein Fehler auftritt (andere positive Rückgabewerte werden hier ein-
  1321. fach ignoriert). Mit dem Aufruf von xfsl_exit wird der Fontselektor
  1322. wieder vom Bildschirm entfernt und anschließend der Rückgabewert aus-
  1323. gewertet.
  1324.  
  1325. Das war doch gar nicht so kompliziert, oder? Von hier aus können Sie
  1326. nun mit den diversen Parametern und Flags weiter experimentieren.
  1327.  
  1328.  
  1329. 2.2 Fragen und Antworten
  1330. ------------------------
  1331.  
  1332. Wie kann ich feststellen, welche Features der Fontselektor bietet?
  1333.  
  1334. Direkt kann dies für einige Features über die Funktion xfsl_info
  1335. geschehen. Indirekt können weitere Features über das Feld 'control'
  1336. in der xFSL_PAR-Struktur abgefragt werden: Nach einem erfolgreichen
  1337. xfsl_init-Aufruf wird der Fontselektor diejenigen Kontrollflags lö-
  1338. schen, die er nicht versteht.
  1339.  
  1340.  
  1341. Wie soll sich mein Programm verhalten, wenn es feststellt, daß der
  1342. Fontselektor das gewünschte Feature nicht unterstützt?
  1343.  
  1344. Wenn überhaupt ein Fontselektor installiert ist, sollte dieser auch
  1345. auf jeden Fall verwendet werden. Je nachdem, wie wichtig das vermißte
  1346. Feature ist, könnte sich Ihr Programm nach Alternativen umsehen (z.B.
  1347. über das Font-Protokoll) oder versuchen, das fehlende Feature zu
  1348. kompensieren.
  1349.  
  1350. Auch hier gilt wieder: Der Anwender wollte einen Fontselektor, keine
  1351. Fehlermeldung. Wenn das fehlende Feature nur schwer zu kompensieren
  1352. ist, dann sollten Sie den Anwender einmalig(!) mit einem entsprechen-
  1353. den Hinweis informieren, aber trotzdem den Fontselektor aufrufen.
  1354. Auch wenn die Auswahl dann nicht mit dem gewünschten Komfort gesche-
  1355. hen kann, ist dies für den Anwender immer noch weniger frustrierend,
  1356. als überhaupt keinen Font auswählen zu können.
  1357.  
  1358. Einige Beispiele: Sollte über das Popup der Font für bestimmte Fen-
  1359. ster des Programms eingestellt werden, so sollte er bei fehlendem
  1360. Popup für das oberste Fenster des Programms übernommen werden. Unter-
  1361. stützt der Fontselektor das Sperren der Größenänderung nicht, so
  1362. sollte die zurückgelieferte Größe einfach ignoriert werden und - wenn
  1363. sie von der gewünschten Größe abweicht - der Anwender durch einen
  1364. Hinweis davon in Kenntnis gesetzt werden.
  1365.  
  1366. Man sollte sich übrigens nicht darauf verlassen, daß der Fontselektor
  1367. beim nächsten Aufruf noch der gleiche ist bzw. die gleichen Features
  1368. unterstützt! Die Fontselektoren, die mit einem Overlay (XFSL.OVL)
  1369. arbeiten können durch einfaches Umkopieren des Overlays jederzeit
  1370. ohne Reset ausgewechselt werden.
  1371.  
  1372.  
  1373. Was hat es mit diesem "Mapping" auf sich?
  1374.  
  1375. Vektorfonts enthalten meist wesentlich mehr als die üblichen 256 Zei-
  1376. chen, noch dazu normalerweise nicht in der gewohnten ASCII-Codierung
  1377. (beispielsweise könnte das Leerzeichen auf Position 0 statt auf 32
  1378. liegen). Daher werden die entsprechenden Zeichen aus dem Font auf die
  1379. "normalen" 256 Zeichen "gemappt" (d.h. abgebildet), so daß sich das
  1380. Leerzeichen wie gewohnt an Position 32 befindet, unabhängig davon,
  1381. welche Position es innerhalb des Fonts hat. Dieses bezeichnet man als
  1382. ASCII-Mapping.
  1383.  
  1384. Per Default ist das ASCII-Mapping aktiv. Dadurch kann man aber die
  1385. Zeichen, die außerhalb des ASCII-Zeichensatzes liegen, nicht anspre-
  1386. chen. Als zweites Mapping steht daher das "direkte Mapping" zur Verfü-
  1387. gung. Hier hat man nun Zugriff auf alle Zeichen eines Fonts. Aller-
  1388. dings muß man dazu auch wissen, um welche Art von Font es sich han-
  1389. delt und wieviele Zeichen der Font enthält: Speedofonts haben meist
  1390. 564 Zeichen, TrueType-Fonts können (theoretisch) bis zu 65536 Zeichen
  1391. enthalten. Diese Information erhält man nach dem Umschalten auf das
  1392. direkte Mapping mit der VDI-Funktion vqt_fontinfo():
  1393.  
  1394.  int minADE, maxADE;
  1395.  
  1396.  vst_charmap(handle,0);
  1397.  vqt_fontinfo(handle,&minADE,&maxADE,dumarray,&dummy,dumarray);
  1398.  
  1399. In 'minADE' erhält man den kleinsten, in 'maxADE' den größten gülti-
  1400. gen Zeichenindex.
  1401.  
  1402. Das direkte Mapping ist für normale Anwendungen nur eingeschränkt
  1403. brauchbar. Im Gegensatz zum ASCII-Mapping, das ein einheitliches
  1404. Mapping für alle Arten von Fonts darstellt, muß man hier nämlich ganz
  1405. genau wissen, um welche Art von Font es sich handelt. So haben z.B.
  1406. die Speedo-Symbolfonts eine andere Codierung als die "normalen"
  1407. Speedofonts. D.h. daß man an Position 64 eines solchen Symbolfonts
  1408. nicht das gleiche Zeichen vorfinden wird wie bei einem "normalen"
  1409. Speedofont.
  1410.  
  1411. Andere Mappings als ASCII sind daher z.Z. für den Großteil der Pro-
  1412. gramme uninteressant. Künftige GDOSse werden aber möglicherweise noch
  1413. andere einheitliche Mappings (z.B. Unicode oder BICS) anbieten, bei
  1414. denen man sich dann wieder darauf verlassen kann, daß an einer be-
  1415. stimmten Position auch immer das gleiche Zeichen liegt (ähnlich wie
  1416. beim ASCII-Mapping, nur eben auch bei Positionen größer 255).
  1417.  
  1418.  
  1419. (to be continued ...)
  1420.  
  1421.  
  1422. 2.3 Programmiertechnische Hinweise
  1423. ----------------------------------
  1424.  
  1425. Die Beschreibung der xFSL-Schnittstelle in diesem Text erfolgt in
  1426. Pure C. In den folgenden Abschnitten werden die Datentypen und Beson-
  1427. derheiten von Pure C näher beschrieben, damit xFSL-Aufrufe auch aus
  1428. anderen Programmiersprachen und C-Dialekten gelingen.
  1429.  
  1430.  
  1431. 2.3.1 Datentypen
  1432.  
  1433. In diesem Text werden die folgenden Datentypen verwendet:
  1434.  
  1435.      Name            Größe
  1436.     ----------------------------------------
  1437.      int             16 Bit mit Vorzeichen
  1438.      unsigned int    16 Bit ohne Vorzeichen
  1439.      long            32 Bit mit Vorzeichen
  1440.      unsigned long   32 Bit ohne Vorzeichen
  1441.  
  1442. Der Datentyp char ist ein (ASCII-)Zeichen und wird hier nur als Zei-
  1443. gertyp verwendet, d.h. als Zeiger auf einen C-String (eine Folge von
  1444. Zeichen, die mit einem Nullbyte abgeschloßen sind).
  1445.  
  1446.  
  1447. Union
  1448.  
  1449. Eine Union entspricht einem varianten Record in Pascal. Es handelt
  1450. sich um eine Struktur, deren einzelne Elemente "übereinander" liegen,
  1451. d.h. denselben Speicherbereich belegen. Welches Element gerade gültig
  1452. ist, ergibt sich aus dem Kontext bzw. bleibt dem Programmierer über-
  1453. lassen.
  1454.  
  1455. Beispiel: In der Struktur PFONTINFO wird für die Größenangabe eine
  1456. Union 'fsize' verwendet:
  1457.  
  1458.     union fsize
  1459.     {
  1460.      int   size;    /* Fontgröße in Punkt         */
  1461.      fix31 size31;  /* Fontgröße in 1/65536 Punkt */
  1462.     };
  1463.  
  1464. Der Speicherbedarf dieser Union beträgt vier Bytes, da der Typ fix31
  1465. vier Bytes groß ist. Man könnte nun dem Element 'size31' eine Größen-
  1466. angabe in 1/65536 Punkt zuweisen und dann den Wert in ganzen Punkt
  1467. aus dem Element 'size' auslesen - dies ist aber nicht empfehlenswert,
  1468. da bei der Umrechnung fix31 nach pt immer gerundet werden sollte,
  1469. s.u.
  1470.  
  1471.  
  1472. fix31
  1473.  
  1474. Der Datentyp fix31 ist eine Festkommazahl, bei dem die oberen 16 Bit
  1475. den vorzeichenbehafteten Vorkomma-Anteil darstellen und die unteren
  1476. 16 Bit den vorzeichenlosen Nachkomma-Anteil. Er wird ausschließlich
  1477. für Größenangaben von Fonts verwendet, die damit auf 1/65536 Punkt
  1478. genau angegeben werden können.
  1479.  
  1480. Bei der Umrechnung von fix31 nach pt darf man das Runden nicht ver-
  1481. gessen. Zitat aus dem NVDI-Guide:
  1482.  
  1483. Man darf nie, nie, niemals den Nachkommateil einfach abschneiden!
  1484.  
  1485.  
  1486. 2.3.2 Parameterübergabe
  1487.  
  1488. Die Übergabe der Parameter bei allen xFSL-Aufrufen geschieht über den
  1489. Stack nach C-Konvention. D.h. daß der beim Aufruf am weitesten rechts
  1490. stehende Parameter zuerst auf den Stack gelegt wird und der am wei-
  1491. testen links stehende Parameter zum Schluß, d.h. beim Einsprung in
  1492. den Fontselektor, obenauf liegt.
  1493.  
  1494.  
  1495. 2.3.3 Pure C und 'cdecl'
  1496.  
  1497. Pure C übergibt die Parameter an Funktionen normalerweise in Regi-
  1498. stern. Für eine Übergabe über den Stack muß entweder das Schlüssel-
  1499. wort "cdecl" verwendet werden (wie im Includefile XFSL.H geschehen)
  1500. oder der Compilerschalter "-H" gesetzt werden.
  1501.  
  1502. Das Schlüsselwort "cdecl" ist eine Pure-C-spezifische Erweiterung und
  1503. wird daher bei gesetztem Compilerschalter "-A" (ANSI-Konformität) an-
  1504. gemahnt.
  1505.  
  1506.  
  1507.  
  1508. 3 Revisions-History
  1509. ===================
  1510.  
  1511. Revision 4
  1512.  
  1513.    ∙ Aufgrund eines kleinen Designfehlers in den älteren Revisionen,
  1514.      der die Erweiterbarkeit der Schnittstelle einschränkte, ist
  1515.      Revision 4 nicht kompatibel zu älteren Revisionen. Dies sollte
  1516.      in der Praxis kein Problem darstellen, da der Fontselektor Auf-
  1517.      rufe nach dem alten Schema mit einem Fehler quittieren wird. Die
  1518.      alte Revision 3 wird im Laufe der Zeit verschwinden.
  1519.  
  1520.    ∙ neue Parameter in der PFONTINFO-Struktur:
  1521.  
  1522.       - Text-Hintergrundfarbe ('backcol')
  1523.  
  1524.       - Textausrichtung ('halign' und 'valign')
  1525.  
  1526.       - Textrotation ('rotation')
  1527.  
  1528.       - Angabe von Zeichen, die der ausgewählte Font unbedingt enthal-
  1529.         ten soll ('validtype' und 'validchars')
  1530.  
  1531.    ∙ die PFONTINFO-Struktur wird auch bei Rückgabe xFS_STOP mit den
  1532.      Werten des zuletzt im Fontselektor ausgewählten Fonts gefüllt
  1533.  
  1534.    ∙ Codierung der Fontflags geändert (feinere Unterscheidung der
  1535.      Vektorformate)
  1536.  
  1537.  
  1538. Revision 3
  1539.  
  1540.    ∙ die erste öffentlich verfügbare Schnittstellen-Revision
  1541.  
  1542.  
  1543. ältere Revisionen
  1544.  
  1545.    ∙ ältere Revisionen können getrost ignoriert werden, da diese nie-
  1546.      mals in einem für eine größere Öffentlichkeit verfügbaren Pro-
  1547.      gramm in Erscheinung getreten sind
  1548.  
  1549.  
  1550.  
  1551. 4 Programmübersicht
  1552. ===================
  1553.  
  1554. Es folgt eine Übersicht über alle z.Z. erhältlichen Fontselektoren,
  1555. die über eine UFSL- oder eine xFSL-Schnittstelle (oder beides) ver-
  1556. fügen.
  1557.  
  1558. Desweiteren folgt eine Liste von Programmen, die einen Fontselektor
  1559. mit einer der beiden Schnittstellen verwenden.
  1560.  
  1561. Ergänzungen und Berichtigungen zu diesen Aufstellungen schicken Sie
  1562. bitte an Dirk Haun (Adresse siehe unter "Kontaktadressen").
  1563.  
  1564.  
  1565. 4.1 Fontselektor-Übersicht
  1566. --------------------------
  1567.  
  1568. Eine kleine Übersicht über die existierenden Fontselektoren:
  1569.  
  1570.  UFSL von Michael Thänitz
  1571.     Dies ist der Prototyp aller externen Fontselektoren. Die letzte
  1572.     veröffentliche Version ist 0.97, danach hat Michael leider die
  1573.     Entwicklung eingestellt. Dankenswerterweise hat er aber die Quell-
  1574.     texte veröffentlicht.
  1575.  
  1576.  FontSel von Holger Weets und Christoph Zwerschke
  1577.     Ein kleiner, aber auch etwas spartanischer Fontselektor von
  1578.     Holger Weets, der seit der Version 1.02 von Christoph Zwerschke
  1579.     weiterentwickelt wird. Ab der Version 1.02 werden auch Teile der
  1580.     xFSL-Schnittstelle unterstützt.
  1581.  
  1582.  xUFSL von Stefan Rogel
  1583.     Der xUFSL bietet gegenüber den bisher genannten Fontselektoren
  1584.     viele zusätzliche Features. Da diese über die existierende UFSL-
  1585.     Schnittstelle nicht angesprochen werden konnten, hat Stefan die
  1586.     Schnittstelle erweitert. Das Design der ersten Version war, vor-
  1587.     sichtig ausgedrückt, "umstritten". Letzte veröffentlichte Versi-
  1588.     on: 1.05. Nachfolger des xUFSL ist ...
  1589.  
  1590.  HuGo! von Stefan Rogel
  1591.     HuGo! ist der an die xFSL-Schnittstelle angepaßte Nachfolger des
  1592.     xUFSL (die UFSL-Schnittstelle wird ebenfalls noch unterstützt,
  1593.     nicht aber die speziellen Erweiterungen des xUFSL an der UFSL-
  1594.     Schnittstelle). Die Namensänderung wurde vollzogen, um Verwechs-
  1595.     lungen zu vermeiden.
  1596.  
  1597.  Calvino von Dirk Haun
  1598.     Zusammen mit HuGo! der erste Fontselektor mit xFSL-Schnittstelle.
  1599.     Auch Calvino unterstützt noch die einfache UFSL-Schnittstelle.
  1600.  
  1601.  FONT_SEL und FONT_PAL von Christian Grunenberg
  1602.     Diese beiden Programme arbeiten auf Drag&Drop-Basis, sie unter-
  1603.     stützen also weder die UFSL- noch die xFSL-Schnittstelle, dafür
  1604.     aber das Font-Protokoll. FONT_SEL ist ein Fontselektor, FONT_PAL
  1605.     eine Fontpalette (mit integriertem Fontselektor).
  1606.  
  1607.  
  1608. 4.2 Programme, die einen Fontselektor unterstützen
  1609. --------------------------------------------------
  1610.  
  1611. Folgende Programme unterstützen einen externen Fontselektor (Stand
  1612. 21.07.1995):
  1613.  
  1614.  Programm       Kategorie           Autor                    UFSL xFSL
  1615. ----------------------------------------------------------------------
  1616.  800XL-Deejay   Laufwerksemulator   Kolja Koischwitz          +
  1617.  APP_List       Systemutility       Ralf Zimmermann @ OF2     +
  1618.  BibelST        Bibel-Software      Reinhard Bartel @ LU           +
  1619.  Cat2Maus       MausTausch          Harald Sommerfeldt @ W    +
  1620.  Chatwin        Shell               Dirk Haun @ WI2           +F   +F
  1621.  CyPress        Textverarbeitung    Rene Bartholomay @ OL          +F
  1622.  DB-Point       Newsreader          Michael Heng @ HH         +
  1623.  Disk Cake      Diskutility         Christoph Zwerschke @ KA  +    +
  1624.  Egale          Dateiutility        David Reitter @ WI2       +
  1625.  Everest        Editor              Oliver Schmidt            +
  1626.  GEMAR          Backup              Steffen Engel @ PE2       +
  1627.  GEM-Fontviewer Zeichensatz-Anzeige Reinhard Bartel @ LU           +
  1628.  GEM-Plan       Tabellenverwaltung  Reiner Rosin @ WI2             +F
  1629.  Hitchcock      Systemutility       Thorsten Pohlmann @ WI2        +
  1630.  IdeaList       ASCII-Druckprogramm Christoph Bartholme @ KA2 +
  1631.  Jedi           GAL-Assembler       Ralf Zimmermann @ OF2     +
  1632.  MasterBrowse   Dateiviewer         Michel Forget             +
  1633.  MenuInfo       Systemutility       Dirk Hagedorn @ MK2            +
  1634.  Okami          Newsreader          Wolfram Rösler @ AC2      +
  1635.  QED            Editor              Christian Felsch @ HH     +
  1636.  RoadRunner     Autofahrtplanung    Andreas Schrell @ RS           +F
  1637.  SaugUtility    dito                Frank Rüger @ OS2         +
  1638.  ST-Guide       Hypertext           Holger Weets @ OL         +
  1639.  STJ-Oberon     Programmiersprache  Stephan Junker @ AC2      +    +
  1640.  Texel          Tabellenkalkulation Thomas Much @ KA2         +    +
  1641.  UpToCASE       CASE-Tool           Michael Nolte @ K         +
  1642.  VESAL          Lernprogramm        Peter Klasen @ KR         +
  1643.  Zeig's mir     Dateiviewer         Reiner Rosin @ WI2        +    +F
  1644. ----------------------------------------------------------------------
  1645.  (+: unterstützt, F: als Fensterdialog; e-mail-Adressen: MausNet)
  1646.  
  1647.  
  1648. Autoren, die nicht über's MausNet erreichbar sind:
  1649.  
  1650.     Kolja Koischwitz: joust@cs.tu-berlin.de
  1651.     Michel Forget:    mforget@worldgate.edmonton.ab.ca
  1652.     Oliver Schmidt:   über Christian Dalichow @ KI (MausNet)
  1653.  
  1654.  
  1655.  
  1656.  
  1657. A Das Font-Protokoll
  1658. ====================
  1659.  
  1660. Beschreibung des Font-Protokolls, Revision 4
  1661.  
  1662. Eine minimale Unterstützung dieses Protokolls besteht in der Auswer-
  1663. tung der Nachricht FONT_CHANGED. Programme, die eines der (GDOS-) At-
  1664. tribute Textwinkel, -breite, -kerning, -neigung oder die Angabe der
  1665. Textgröße in 1/65536 Punkt unterstützen, sollten auch die Nachricht
  1666. XFONT_CHANGED, die zusätzliche Informationen anbietet, unterstützen.
  1667.  
  1668. Über die Nachricht FONT_SELECT kann der Fontselektor auch von der Ap-
  1669. plikation aufgerufen werden. Dabei können auch die aktuell eingestell-
  1670. ten Attribute übergeben werden.
  1671.  
  1672. Unterstützt die Anwendung auch das XAcc-2-Protokoll, so kann sie auch
  1673. leicht die Unterstützung der Bestätigungsnachricht FONT_ACK offenle-
  1674. gen und ohne Environment-Variable nach Fontselektoren im Speicher
  1675. suchen.
  1676.  
  1677.    ∙ FONT_CHANGED-Nachricht:
  1678.      Nachricht des Fontselektors an eine Applikation, daß der Zeichen-
  1679.      satz und/oder die Zeichenattribute (Größe, Farbe und Effekte) in
  1680.      einem oder mehreren Fenstern der Applikation gewechselt werden
  1681.      sollen. Besitzt die Zielapplikation im erweiterten XAcc-Namen
  1682.      die Kennung "XFontAck", so muß diese Nachricht mit der Nachricht
  1683.      FONT_ACK beantwortet werden. Ansonsten ist die Unterstützung die-
  1684.      ser Nachricht optional.
  1685.  
  1686.      Negative Werte in msg[6/7] bzw. Null in msg[4/5] stehen für
  1687.      keine Veränderung
  1688.  
  1689.          msg[0]        = FONT_CHANGED (0x7a18)
  1690.          msg[1]        = apID
  1691.          msg[2]        = 0
  1692.          msg[3]        = Fenster-Handle oder negativer Wert, falls
  1693.                          Font in allen Fenstern gewechselt werden soll
  1694.          msg[4]        = Font-ID oder Null
  1695.          msg[5]        = Font-Größe in Punkt (>0) oder Pixel (<0)
  1696.                          bzw. Null für keine Veränderung
  1697.          msg[6]        = Font-Farbe
  1698.          msg[7]        = Effekte:
  1699.                           Bit 0: Fett
  1700.                           Bit 1: Hell
  1701.                           Bit 2: Kursiv
  1702.                           Bit 3: Unterstrichen
  1703.                           Bit 4: Umrandet
  1704.                           Bit 5: Schattiert
  1705.                           Bit 6: Invers
  1706.                           (restliche Bits sind reserviert)
  1707.  
  1708.    ∙ XFONT_CHANGED-Nachricht:
  1709.      Erweiterte (GDOS-)Attribute übermitteln. Diese Nachricht ist op-
  1710.      tional und wird vor der Nachricht FONT_CHANGED verschickt, d.h.
  1711.      erst wenn die Nachricht FONT_CHANGED eintrifft und den gleichen
  1712.      Absender (msg[1] vergleichen!) hat, sollten diese Werte gesetzt
  1713.      werden! Dadurch werden doppelte Redraws und/oder Fehler vermie-
  1714.      den.
  1715.  
  1716.      Die Nachricht FONT_CHANGED enthält die auf Punkt gerundete Grö-
  1717.      ße, d.h. Programme, die XFONT_CHANGED nicht unterstützen, können
  1718.      diesen Wert benutzen.
  1719.  
  1720.      Fontselektoren versenden idR diese Nachricht nur, wenn eines der
  1721.      übermittelten Attribute vom Normalwert abweicht!
  1722.  
  1723.          msg[0]   = XFONT_CHANGED (0x7a1b)
  1724.          msg[1]   = apID
  1725.          msg[2]   = 0
  1726.          msg[3/4] = Größe in 1/65536-Punkt (fix31)
  1727.          msg[5]   = Rotationswinkel in 1/10-Grad (0-3599)
  1728.          msg[6]   = Neigung in 1/10-Grad (-1800 - 1800)
  1729.          msg[7]   = Breite und Kerning:
  1730.                     Bit 15:    Paar-Kerning
  1731.                     Bit 13/14: Track-Kerningmodus (0-3)
  1732.                     Bit 0-12:  Breite in Punkt
  1733.          
  1734.                     in C:
  1735.          
  1736.                     typedef struct
  1737.                     {
  1738.                         unsigned int  pair  : 1;
  1739.                         unsigned int  track : 2;
  1740.                         unsigned int  width : 13;
  1741.                     } VECTOR_INFO;
  1742.  
  1743.    ∙ FONT_SELECT-Nachricht:
  1744.      Mit dieser Nachricht kann ein im Speicher vorhandener Fontselek-
  1745.      tor, der im erweiterten XAcc-Namen die Kennung "XFontSelect" be-
  1746.      sitzt, aufgerufen werden. Unterstützt die Anwendung und/oder der
  1747.      Fontselektor kein XAcc-2-Protokoll, so kann noch nach dem Inhalt
  1748.      der (AES-)Environment-Variablen "FONTSELECT" gesucht werden. Die-
  1749.      se Variable kann gegebenenfalls auch mehrere Namen (getrennt
  1750.      durch Semikolon) enthalten, wobei die Namen optional auch Pfad
  1751.      und Dateierweiterung besitzen können, so daß man den Fontselek-
  1752.      tor unter Multitasking bei Bedarf parallel nachladen kann.
  1753.  
  1754.      Beispiele:
  1755.  
  1756.      setenv FONTSELECT=FONT_PAL;FONT_SEL
  1757.      setenv FONTSELECT=C:\FONTSEL\FONT_SEL.APP;C:\FONTSEL\FONT_PAL.APP
  1758.  
  1759.      Zur passiven Unterstützung des Font-Protokolls genügt aber die
  1760.      Auswertung der o.g. Nachrichten FONT_CHANGED und XFONT_CHANGED.
  1761.  
  1762.      Negative Werte in msg[6/7] oder eine Null msg[4/5] bedeuten, daß
  1763.      dieser Parameter nicht benötigt wird, nicht eingestellt werden
  1764.      soll oder noch nicht gesetzt wurde
  1765.  
  1766.          msg[0]        = FONT_SELECT (0x7a19)
  1767.          msg[1]        = apID
  1768.          msg[2]        = 0
  1769.          msg[3]        = Handle des Fensters, dessen Zeichensatz einge-
  1770.                          stellt werden soll, oder ein negativer Wert,
  1771.                          wenn der Zeichensatz in allen Fenstern der
  1772.                          Applikation gewechselt werden soll
  1773.          msg[4]        = Font-ID oder Null
  1774.          msg[5]        = Font-Größe in Punkt (>0) oder Pixel (<0) bzw.
  1775.                          Null, falls der Parameter nicht benötigt wird
  1776.                          (s.o.)
  1777.          msg[6]        = Farbe
  1778.          msg[7]        = Effekte (s.o.)
  1779.  
  1780.    ∙ FONT_ACK-Nachricht:
  1781.      Fontselektor darüber informieren, ob die FONT_CHANGED-Nachricht
  1782.      ausgewertet bzw. die Zeichensatz-Attribute eingestellt werden
  1783.      konnten
  1784.  
  1785.          msg[0]         = FONT_ACK (0x7a1a)
  1786.          msg[1]         = apID
  1787.          msg[2]         = 0
  1788.          msg[3]         = TRUE (1):  Nachricht wurde ausgewertet
  1789.                           FALSE (0): Nachricht wurde ignoriert
  1790.          msg[4-7]       = 0 (reserviert)
  1791.  
  1792.  
  1793.  
  1794. B Die UFSL-Schnittstelle
  1795. ========================
  1796.  
  1797. Der Vollständigkeit halber folgt hier noch die Original-Beschreibung
  1798. von Michael Thänitz zur ursprünglichen UFSL-Schnittstelle:
  1799.  
  1800. Programmierschnittstelle:
  1801.  
  1802. UFSL ist eine Fontauswahlbox für den Autoordner. Sie bietet dem Pro-
  1803. grammierer eine einfache Programmierschnittstelle über einen Cookie.
  1804.  
  1805. Der Cookie lautet: "UFSL".
  1806. Der Cookie liefert einen Zeiger auf folgende Struktur:
  1807.  
  1808.  typedef struct
  1809.  {
  1810.   unsigned long  id;      /* UFSL ID (UFSL)       */
  1811.   unsigned int   version; /* Version (BCD-Format) */
  1812.   int dialtyp;            /* 0=Dialog, 1=Fenster  */
  1813.   int cdecl (*font_selinit)(void);
  1814.   int cdecl (*font_selinput)(
  1815.               int vdihandle,
  1816.               int dummy,
  1817.               char *text,    /* eigener Text, max. 34 Zeichen      */
  1818.               int ftype,     /* 1=nur monospaced Fonts, 0=alles    */
  1819.               int *fretid,   /* eingestellte FontId                */
  1820.               int *fretsize  /* eingestellte Fontgröße             */
  1821.               );
  1822.   OBJECT *helpbutton;           /* Typ: BOXTEXT                    */
  1823.   void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt.     */
  1824.  
  1825.   /**** ab Version 0.91 ********************************************/
  1826.   char *examplestr;            /* Beispieltext für Fontdarstellung */
  1827.  
  1828.   /**** ab Version 0.96 ********************************************/
  1829.   void cdecl (*msgfunc)(int event, int msgbuf[]);/* Redrawfunktion */
  1830.  
  1831.   /**** ab Version 0.97 ********************************************/
  1832.   int cdecl (*fontsel_exinput)(
  1833.               int vdihandle,
  1834.               int ftype,     /* 1=nur monospaced Fonts, 0=alles    */
  1835.               char *text,    /* eigener Text, max. 34 Zeichen      */
  1836.               int *fretid,   /* eingestellte FontId                */
  1837.               int *fretsize  /* eingestellte Fontgröße             */
  1838.               );
  1839.  } UFSL;
  1840.  
  1841. Aufruf:
  1842.  
  1843. UFSL *ufsl;
  1844. ufsl=(UFSL *)get_cookie('UFSL');
  1845. ufsl->helpfunc= my_helpfunc;   /* Hilfefunktion oder NULL */
  1846. ufsl->msgfunc = my_msghandler; /* Redrawfunktion oder NULL,
  1847.                                   Dialtyp beachten */
  1848. ufsl->fontsel_input(vdihandle,"Bitte Font auswählen",0,&id,&size);
  1849. oder
  1850. ufsl->fontsel_input(vdihandle,NULL,0,&id,&size);
  1851.  
  1852. Returncodes:
  1853.  
  1854.  1 : Alles OK, Werte gültig.
  1855.  0 : Abbruch gewählt.
  1856. -1 : Out of memory.
  1857. -2 : Unzulässiger Mehrfachaufruf.
  1858. -3 : Fontgröße konnte nicht identifiziert werden.
  1859. -4 : Anzahl Fonts muß größer null sein.
  1860.  
  1861. Sonderfunktionen:
  1862.  
  1863. void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt.     */
  1864.  
  1865. UFSL kann eine benutzerdefinierbare Hilfefunktion über den ebenfalls
  1866. optionalen Hilfebutton aufrufen. helpfunc() benötigt keine Parameter
  1867. und liefert auch keinen Wert zurück.
  1868.  
  1869. void cdecl (*msgfunc)(int event, int msgbuf[]); /* Redrawfunktion */
  1870.  
  1871. Bei Verwendung von UFSL als Fensterdialog ist es notwendig eine Re-
  1872. drawfunktion zur Verfügung zu stellen. Sie schickt die anfallenden
  1873. Events an das aufrufende Programm zurück, damit nach Verschieben des
  1874. Dialogs die Hintergrundfenster restauriert werden können. msgfunc()
  1875. liefert als ersten Parameter das Ergebnis von evnt_multi() und als
  1876. zweiten Parameter die MsgPipe. Ein Returncode wird nicht benötigt.
  1877. Das Anwenderprogramm muβ die nötigen Routinen zur Fensterbehandlung
  1878. zur Verfügung stellen. wind_update(..._UPDATE) wird von UFSL nicht
  1879. gesetzt, obliegt also dem rufenden Anwenderprogramm. Prinzipbedingt
  1880. (?) ist die Memoryprotection von MTOS auszuschalten.
  1881.  
  1882. Grundsätzlich gilt es zu überlegen, ob tatsächlich alle Events ent-
  1883. sprechend beantwortet werden sollen. Ein WM_TOPPED, das andere eigene
  1884. Fenster nach vorn bringt, sollte wohl nicht beantwortet werden, da
  1885. UFSL naturgemäβ nur applikationsmodal sein kann, da UFSL ja in einem
  1886. eigenen form_do() sprich evnt_multi() kreist.
  1887.  
  1888.  
  1889.  
  1890. C Hinweise für Autoren anderer Fontselektoren
  1891. =============================================
  1892.  
  1893. Autoren anderer Fontselektoren sind dazu eingeladen, sich der xFSL-
  1894. Schnittstelle anzuschließen. Im Prinzip kann jeder Fontselektor, der
  1895. als TSR konzipiert ist, mit der xFSL-Schnittstelle ausgerüstet wer-
  1896. den.
  1897.  
  1898. Damit keine Mißverständnisse entstehen: Die Overlay-Technik und die
  1899. Reentranz, wie sie Calvino und HuGo! bieten, sind nicht Teil der ei-
  1900. gentlichen Schnittstelle und müssen von anderen Fontselektoren daher
  1901. auch nicht unterstützt werden. Allerdings ist auch die Schnittstelle
  1902. zwischen dem residenten Teil ("Shell") und dem nachgeladenen Teil
  1903. ("Overlay") genormt und kann daher auch von anderen Fontselektoren
  1904. verwendet werden. Eine Beschreibung dieser internen Schnittstelle ist
  1905. auf Anfrage erhältlich, siehe "Kontaktadressen".
  1906.  
  1907. Da bereits eine Reihe von Programmen die alte UFSL-Schnittstelle un-
  1908. terstützen, erscheint es ratsam, auch in neuen Fontselektoren diese
  1909. Schnittstelle noch zur Verfügung zu stellen. Jedoch zeigt ein kurzer
  1910. Blick auf diese Programme, daß sie fast ausschließlich den Fontselek-
  1911. tor als modalen Dialog aufrufen. Die Empfehlung lautet daher, eine
  1912. minimale UFSL-Unterstützung einzubauen (nur als modaler Dialog) und
  1913. dafür die xFSL-Schnittstelle möglichst weitgehend zu implementieren,
  1914. da zu erwarten steht, daß gerade die - nun endlich genormten - Erwei-
  1915. terungen gegenüber der UFSL-Schnittstelle von den Programmen verwen-
  1916. det werden sollen.
  1917.  
  1918. Ein Fontselektor sollte möglichst die folgenden zusätzlichen Features
  1919. bieten:
  1920.  
  1921.    ∙ Größenänderung möglich
  1922.      Insbesondere ist damit gemeint, daß nicht nur eine Größe ausge-
  1923.      wählt, sondern bei Vektorfonts auch die Zwischengrößen einge-
  1924.      stellt werden können.
  1925.  
  1926.    ∙ fix31-Unterstützung
  1927.      Für einige Anwendungen reicht die Einstellung der Fontgröße in
  1928.      Punkt nicht aus, daher sollte auch eine Einstellung in 1/65536
  1929.      Punkt möglich sein.
  1930.  
  1931.    ∙ User-Popup
  1932.      Durch das zusätzliche Popup wird der Fontselektor flexibler ein-
  1933.      setzbar.
  1934.  
  1935.    ∙ Drag&Drop-Unterstützung
  1936.      Neben dem "traditionellen" Aufruf über den Cookie kommen Lö-
  1937.      sungen auf Drag&Drop-Basis immer mehr in Mode. Wenn der Fontse-
  1938.      lektor von sich aus schon Drag&Drop unterstützt, läßt er sich
  1939.      leicht durch ein kleines "Frontend"-Programm in einen vollwerti-
  1940.      gen Drag&Drop-Selektor verwandeln.
  1941.  
  1942. Folgende Konventionen wurden für einen xFSL-Fontselektor vereinbart:
  1943.  
  1944.    ∙ Wenn der Fontselektor über einen Closer verfügt, so wird dieser
  1945.      als "Abbruch" interpretiert, d.h. es wird xFS_STOP zurückgege-
  1946.      ben. Ist das Kontrollflag CC_CLOSER gesetzt, wird der gerade
  1947.      aktuelle Font aber trotzdem zurückgegeben (in der PFONTINFO-
  1948.      Struktur in xFSL_PAR).
  1949.  
  1950.    ∙ Wenn der erweiterte Aufruf (xfsl_init, xfsl_event und xfsl_exit)
  1951.      nicht unterstützt wird, muß zumindest eine Dummy-Funktion für
  1952.      xfsl_init installiert werden, die immer -32 (Gemdos-Fehlermel-
  1953.      dung EINVFN, ungültige Funktionsnummer) zurückgibt.
  1954.  
  1955.      Es wird aber dringend empfohlen, den erweiterten Aufruf anzubie-
  1956.      ten, da dieser am häufigsten verwendet wird.
  1957.  
  1958.    ∙ Es ist legal, daß der Fontselektor beim erweiterten Aufruf nur
  1959.      als modaler Dialog erscheint. Bei gesetztem CC_WINDOW sollte
  1960.      xfsl_init dann aber xFS_NO_WINDOW zurückgeben, damit sich der
  1961.      Aufrufer darauf einstellen kann.
  1962.  
  1963.  
  1964.  
  1965. D Kontaktadressen
  1966. =================
  1967.  
  1968. Die xFSL-Schnittstelle wurde von Dirk Haun und Stefan Rogel unter tat-
  1969. kräftiger Mithilfe von Reiner Rosin und einer Reihe fleißiger Beta-
  1970. tester entwickelt.
  1971.  
  1972. Wenn Sie Fragen und/oder Anmerkungen zur xFSL-Schnittstelle haben,
  1973. dann wenden Sie sich doch einfach an
  1974.  
  1975.     Dirk Haun
  1976.     Europastr. 8
  1977.     D-64569 Nauheim
  1978.  
  1979.     e-mail: Dirk Haun @ WI2 (MausNet)
  1980.  
  1981. oder an
  1982.  
  1983.     Stefan Rogel
  1984.     Köhlerweg 1
  1985.     D-67661 Kaiserslautern
  1986.  
  1987.     e-mail: Stefan Rogel @ LU (MausNet)
  1988.  
  1989.  
  1990. Das Font-Protokoll stammt von
  1991.  
  1992.     Christian Grunenberg
  1993.     Traminerweg 5
  1994.     D-71717 Beilstein
  1995.  
  1996.     e-mail: Christian Grunenberg @ LB (MausNet)
  1997.  
  1998.  
  1999.  
  2000.  
  2001.